2017-09-05 100 views
0

我想按一列分组,获得第二列的最小值和最大值,并且(这是棘手的部分!)从第三列中获取值列中第二列在组中的最小值。SQL group by:select value where another column has min/max

实施例:

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部分呢?它不会以分组的方式工作,对吧?但为什么?什么是最好的解决方法?

+0

您需要一个JOIN才能找到该行。 – jarlh

+0

如果有关系怎么办?或者它们不能发生(即你对TS + GRP有独特的限制)? –

+0

你是对的,这就是为什么它不能与分组一起工作... – Andy

回答

2

不要在一个子查询聚集,然后抬头看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_tsmax_ts,然后过滤为仅包含每个组的第一行(按ts排序)。

+0

我更喜欢你使用窗口函数的第二种解决方案。 – Andy