【问题标题】:SELECT MIN Date using WINDOW functions with additional row conditionSELECT MIN Date 使用带有附加行条件的 WINDOW 函数
【发布时间】: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


【解决方案1】:

获取每个id的最小B日期,然后获取该日期之后的最小A日期。

Brat 的预期结果应该是 '9/21/2016'。

select id,name,min(sdate) from (
select id,name,code,SDate
,min(case when code='B' then sdate end) over(partition by id) as min_b_dt
 from tt) x
 where code = 'A' and sdate >=min_b_dt
 group by id,name

【讨论】:

  • 8/7/16 将早于 9/21/16
  • @AS91 我需要按每个ID组提取Code= A的最早SDate,这样它就是Code=B的最早SDate之后的最早SDate。以前不是。问题是这样说的
  • 对不起,如果我的措辞令人困惑。我的意思是:对于Brat来说,最早的CodeB SDate是8/19/16,而最早的CodeA SDate是8/19/16之后的8/7/16。因此 2016 年 8 月 7 日。对于 Ashley,只有一个 CodeB SDate,所以自然 4/12/16 成为输出中最早的 CodeA SDate。
  • @AS91 .. 8/7/2016 早于 8/19/16.. 所以 8/19/2016 之后最早的 A 应该是 9/21/2016。
  • 你明白了。我的错。我没有想到 Brat,只是考虑了最早的 A,部分原因是我在最初忽略这一点时是如何提出问题的。谢谢。感谢您的耐心。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 2021-08-09
  • 2021-05-03
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多