我尝试获取每个用户(USER_ID
)的X(DEF_ENDING
)的倒数第二条记录之后的第一个BEG_PERIOD
日期。
所以我有这个:
| 用户ID|开始_周期|结束_周期|定义_结束|
| - ------|- ------|- ------|- ------|
| 一百五十九|2022年7月1日|二○二二年七月三十一日|十|
| 一百五十九|二○二二年九月二十五日|二○二二年十月十五日|十|
| 一百五十九|二○二二年十一月一日|二○二二年十一月十三日||
| 一百五十九|二○二二年十一月十四日|二○二二年十二月二十一日|十|
| 一百五十九|2023年1月1日|二○二三年一月三十日|十|
| 四一四|二○二二年四月一日|二○二二年五月三十一日|十|
| 四一四|2022年7月1日|二○二二年九月三十日||
| 四一四|2022年10月1日|二○二二年十二月一日|十|
| 四百八十|2022年7月1日|二○二二年六月三十日||
| 四百八十|2022年7月1日|二○二二年八月三十日|十|
| 四百八十|二○二二年九月二日|二○二二年十一月一日|十|
| 五零三|二○二二年三月十五日|二○二二年六月十六日|十|
| 五零三|二○二二年七月十九日|二○二二年七月二十三日||
| 五零三|二○二二年七月二十四日|二○二二年十月三十一日||
| 五零三|二○二二年十一月一日|二○二二年十二月二十一日|十|
我需要的日期是粗体字
你能帮帮我吗?
我试过这个,但我只得到最新的日期:(
SELECT
p.USER_ID,
p.BEG_PERIOD
FROM
PERIODS p
INNER JOIN PERIODS p2 ON
p.USER_ID = p2.USER_ID
AND
p.BEG_PERIOD = (
SELECT
MAX( BEG_PERIOD )
FROM
PERIODS
WHERE
PERIODS.USER_ID = p.USER_ID
)
WHERE
p.USER_ID > 10
3条答案
按热度按时间9jyewag01#
这应基于样本数据:
如果你不能相信这两个日期是最小值,那么:
如果在类的级别上更合适的话,也可以完全通过子查询来完成:
toe950272#
使用
ROW_NUMBER
和'LAG'窗口函数尝试以下操作:See demo
5jdjgkvh3#
我认为,这在SQL Server 2008上有效
结果
| 用户ID|开始_周期|结束_周期|定义_结束|数量|倒数第二|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 一百五十九|2022年7月1日|二〇二二年七月三十一日|十|四个|2023年1月1日|
| 一百五十九|二〇二二年九月二十五日|二〇二二年十月十五日|十|三个|2023年1月1日|
| 一百五十九|二○二二年十一月一日|二〇二二年十一月十三日|零|第二章|2023年1月1日|
| 一百五十九|二〇二二年十一月十四日|二〇二二年十二月二十一日|十|第二章|2023年1月1日|
| 一百五十九|2023年1月1日|2023年1月30日|十|1个|2023年1月1日|
| 四一四|2022年4月1日|二○二二年五月三十一日|十|第二章|2022年7月1日|
| 四一四|2022年7月1日|2022年9月30日|零|1个|2022年7月1日|
| 四一四|二○二二年十月一日|二○二二年十二月一日|十|1个|2022年7月1日|
| 四百八十|2022年7月1日|2022年6月30日|零|第二章|2022年9月2日|
| 四百八十|2022年7月1日|2022年8月30日|十|第二章|2022年9月2日|
| 四百八十|2022年9月2日|二○二二年十一月一日|十|1个|2022年9月2日|
| 五零三|2022年3月15日|二〇二二年六月十六日|十|第二章|2022年7月19日|
| 五零三|2022年7月19日|二〇二二年七月二十三日|零|1个|2022年7月19日|
| 五零三|二〇二二年七月二十四日|二〇二二年十月三十一日|零|1个|2022年7月19日|
| 五零三|二○二二年十一月一日|二〇二二年十二月二十一日|十|1个|2022年7月19日|
关于并行数据仓库,
如前所述here,2012年之前的非PDW版本的SQL Server不支持带有聚合函数(如MIN)的ORDER BY子句。
与从SQL Server 2005开始提供的基本实施相比,窗口函数支持在2012年得到了大幅扩展。这些扩展在合并到Box产品之前已在Parallel Data Warehouse中提供。