我的查询是:
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 中,您可以使用 RANK
、 DENSE_RANK
或 ROW_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 在这里