如果两行返回最大值,则子句分组依据



我的查询是:

SELECT ID,B,C,D, SUM(X), SUM(Y)
FROM TABLE
GROUP BY A,B,C,D

但是,如果查询返回 2 行具有相同 id,我只想取一行最大为 D 列的行。

例如,如果查询返回:

+----+---+---+---+--------+--------+
| ID | B | C | D | SUM(X) | SUM(Y) |
+----+---+---+---+--------+--------+
| 2  | 1 | 1 | 1 | 70     | 100    |
| 2  | 1 | 1 | 3 | 100    | 150    |
+----+---+---+---+--------+--------+
然后删除 D=1 的行

,只保留 D=3 的行

如果你想要每id一行,那么这应该是group by中唯一的一列:

SELECT ID, SUM(X), SUM(Y)
FROM TABLE
GROUP BY ID;

将查询放入CTE中,然后筛选结果:

;WITH CTE AS (
SELECT ID,B,C,D, SUM(X) AS X, SUM(Y) AS Y
FROM TABLE
GROUP BY ID,B,C,D
)
SELECT * FROM CTE T
WHERE [D] = (SELECT MAX(D) FROM CTE where id = t.id)
您希望

为每个 ID/B/C 组合显示一行。如果您发现一个组合的多个结果(在您的示例中为 ID=2、B=1、C=1(,则需要具有最大 D 的结果。因此,您必须对聚合结果进行排名。

在标准 SQL 中,您可以使用 RANKDENSE_RANKROW_NUMBER 对行进行排名,具体取决于您要对领带执行的操作。我们不知道你的DBMS,但许多DBMS都有这些功能,所以试试吧。

select id, b, c, d, sum_x, sum_y
from
(
  select 
    id, b, c, d, sum(x) as sum_x, sum(y) as sum_y,
    row_number() over (partition by id, b, c order by d desc) as rnk
  from table
  group by id, b, c, d
) ranked
where rnk = 1;

你可以像这样使用JOIN

SELECT t1.ID, t1.B, t1.C, t1.D, SUM(t1.X), SUM(t1.Y)
FROM TABLE1 t1
join (select ID, max(D) D from TABLE1 group by ID) t2 
on t1.ID=t2.ID and t1.D=t2.D
GROUP BY t1.ID, t1.B, t1.C, t1.D

SQL 在这里

最新更新