所以我有一张这样的桌子
id | date1 |date2 |value
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2014|1/1/2016|300
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2015|1/1/2016|300
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2009|200
1 | 1/1/2017|1/1/2009|200
1 | 1/1/2017|1/1/2016|300
注意:Value col 值可以是随机的
如何通过各种 ID 获取 date1>=date2 的行。
本质上,如果 date1 是 2014 那么我只想得到 date1-date2 最小但不是负数的行。
示例表的结果如下所示:
id | date1 |date2 |value
1 | 1/1/2014|1/1/2009|200
1 | 1/1/2015|1/1/2009|200
1 | 1/1/2017|1/1/2016|300
我希望我解释得很好,如果没有,请随时提问。
我正在使用 MS SQL SERVER 2014
到目前为止我已经尝试过:
select id,date1,min(date2) over (partition by id,date1 order by id, date1) date2, value
from tblA
这给了我:
id | date1 |date2 |value
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|100
1 | 1/1/2014|1/1/2004|200
1 | 1/1/2014|1/1/2004|200
1 | 1/1/2014|1/1/2004|300
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|100
1 | 1/1/2015|1/1/2004|200
1 | 1/1/2015|1/1/2004|200
1 | 1/1/2015|1/1/2004|300
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|100
1 | 1/1/2017|1/1/2004|200
1 | 1/1/2017|1/1/2004|200
1 | 1/1/2017|1/1/2004|300
这是摆弄表格的链接
我认为你想要做的是根据每年日期之间的最小差异对数据进行排名 - 但你只需要考虑任何
date1
大于date2
. 为此,我个人会使用 CTE 在返回结果之前对结果进行过滤和排名,如下所示:您可以在dbfiddle上找到结果。
有关详细信息,请参阅RANK和CTE的官方文档。