我想按一列分组,获取第二列的最小值和最大值,并且(这是棘手的部分!)从第三列获取值,其中第二列在组中具有其最小值。
例:
MyTable:
ID TS GRP
==================
1 20 A
2 20 B
3 10 A
4 30 A
5 10 B
6 40 A
所需的结果(ID应该是TS最小的记录中的值):
ID MIN_TS MAX_TS GRP
============================
3 10 40 A
5 10 20 B
通常,分组查询非常简单:
SELECT <???> AS ID, MIN(TS) AS MIN_TS, MAX(TS) AS MAX_TS, GRP
FROM MyTable
GROUP BY GRP
但是ID部分呢?不能通过这种方式进行分组,对吗?但为什么?最好的解决方法是什么?
在子查询中进行汇总,然后在另一个子查询中查找每个组的ID:
SELECT
(SELECT TOP(1) id FROM MyTable WHERE grp = agg.grp ORDER BY ts DESC) AS id,
min_ts, max_ts, grp
FROM (SELECT min(ts) AS min_ts, max(ts) AS max_ts, grp
FROM MyTable
GROUP BY grp) agg
或使用窗口功能:
SELECT id, min_ts, max_ts, grp
FROM (SELECT
id,
min(ts) OVER (PARTITION BY grp) min_ts,
max(ts) OVER (PARTITION BY grp) max_ts,
grp,
row_number OVER (PARTITION BY grp ORDER BY ts) rn
FROM MyTable)
WHERE rn = 1;
此查询使用窗口函数来计算min_ts
,并max_ts
为每个组,然后过滤,以仅包括用于每个组(由有序的第一行ts
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句