【发布时间】:2017-05-07 07:43:04
【问题描述】:
对于表 TT:
+----+------+-----------+------+
| ID | Name | SDate | Code |
+----+------+-----------+------+
| 1 | Ash | 4/12/2016 | A |
| 1 | Ash | 4/19/2016 | A |
| 1 | Ash | 2/14/2016 | B |
| 1 | Ash | 1/1/2016 | A |
| 2 | Brat | 9/21/2016 | A |
| 2 | Brat | 8/7/2016 | A |
| 2 | Brat | 8/19/2016 | B |
| 2 | Brat | 11/21/2016| B |
+----+------+-----------+------+
最好使用窗口函数(如果窗口不支持子查询分组也可以工作),
我需要按每个ID 组为Code= A 提取最早的SDate,这样它就是Code=B 之后的最早 SDate 的最早强>SDate。不是以前。所以期望的输出:
+----+------+-----------+
| ID | Name | SDate |
+----+------+-----------+
| 1 | Ash | 4/12/2016 |
| 2 | Brat | 8/7/2016 |
+----+------+-----------+
代码尝试:
SELECT DISTINCT
TT.ID AS ID
,TT.Name AS Name
,MIN(CASE WHEN TT.Code='A' THEN TT.SDate END) OVER (PARTITION BY TT.ID) AS SDate
FROM TT
ORDER BY TT.ID
这给了我每个不同 ID 的 Code=A 最早的 SDate,而不是最早的 Code=B 之后的最早 Code=B
【问题讨论】:
-
一个id可以有多个code=B吗?
-
对代码 B 了解多少?每个名称总是出现一次吗?
-
是的。好点子。所以最早的代码=A,最早的代码=B。问题已更新。
标签: sql sql-server tsql sql-server-2012 group-by