查询语句:使用DISTINCT但也使用MAX条件

问题描述 投票:0回答:1

我的数据库中有一个表,如下所示。请注意,PRV 下有重复的条目。

PRV MV AU
G-111 500 LR
G-112 400 LC
G-112 401 洛杉矶
G-200 650
G-115 350 LR
G-115 0 LC
G-115 0 洛杉矶
G-116 0 LR

我使用以下查询语句来获取根据 AU 分组的不同 PRV 的数量。

SELECT
    COUNT(*),
    AU
FROM
    (
        SELECT DISTINCT
            PRV,
            AU
        FROM
            tablename
        WHERE
            MV > O
    ) AS K
GROUP BY
    AU

结果:

COUNT(*)
AU
2 LR
1 LC
0 洛杉矶
1

我不明白的是如何确保分组不仅仅是基于

MV>0
而且
MV
是重复
PRVs
中的最大值。

对于最后 3 行(其中

PRV = 'G-115'
),我的查询语句工作正常,因为带有 AU = LR 的 MV=350,而其他的则为零。因此,G-115 仅算作一个单位并归入 LR 下。

但是,在第二行和第三行的情况下(其中 PRV = 'G-112'),它确实只算作 1(因为 DISTINCT 关键字),但我希望它被分组为 LA(而不是 LC) )因为 LA 的 MV = 401(大于 LC 行中的 MV=400)。

所以,期望的结果是:

COUNT(*)
AU
2 LR
0 LC
1 洛杉矶
1

我读到了

MAX
关键字,但我不知道如何在我的案例中使用它。

在我的实际表格中,

distinct
关键字似乎不适用于第2行和第3行。它们实际上被计算了两次,因为
MV > 0
对于两个条目都适用。

conditional-statements max distinct
1个回答
0
投票

根据您上面的原始查询,我想不出一个简单的解决方案。 此方法使用 PARTITION BY(假设您的数据库支持它)。这里我们按 PRV 进行分区,并按 PRV 和 MV 降序排序,因此对于最高的 PRV+MV 组合,结果具有 ROW=1。 然后我们对结果进行相应的求和:

  ;WITH 
    data
    AS
    (
    SELECT
        *, 
        ROW_NUMBER() OVER(PARTITION BY PRV ORDER BY PRV, MV DESC) AS ROW
    FROM
        prv
    WHERE MV > 0
    )
    SELECT
      SUM(CASE WHEN ROW = 1 THEN 1 ELSE 0 END), 
      AU
    FROM
      data
    GROUP BY AU
© www.soinside.com 2019 - 2024. All rights reserved.