因此,我想拥有所有CHARGE
,其中下一个HPDATUM
是1年前。
当前查询如下:
SELECT DISTINCT CHARGE, HPDATUM FROM dbo.table123 WHERE CHARGE = '8811985' GROUP BY CHARGE, HPDATUM
这是一个示例查询,其中CHARGE
的位置限制在最终查询中将消失,以获取所有CHARGE
。
这是上面查询的示例输出:
CHARGE HPDATUM
8811985 1999-10-08 | NEW ENTRY
8811985 2003-06-25 | NEW ENTRY
8811985 2003-06-26 | DUPLICATE TO THE ONE ABOVE
8811985 2004-09-04 | NEW ENTRY
8811985 2004-09-05 | DUPLICATE TO THE ONE ABOVE
8811985 2005-01-09 | DUPLICATE TOO
答案 0 :(得分:4)
对于每个费用组,我们可以尝试在此处使用LEAD/LAG
将当前HPDATUM
日期与序列中之前/之后的日期进行比较。
WITH cte AS (
SELECT CHARGE, HPDATUM,
LAG(HPDATUM, 1, DATEADD(year, -1, HPDATUM)) OVER (PARTITION BY CHARGE ORDER BY HPDATUM) HPDATUM_PREV,
LEAD(HPDATUM, 1, DATEADD(year, 1, HPDATUM)) OVER (PARTITION BY CHARGE ORDER BY HPDATUM) HPDATUM_NEXT
FROM dbo.table123
)
SELECT CHARGE, HPDATUM
FROM cte
WHERE
DATEDIFF(year, HPDATUM, HPDATUM_PREV) >= 1 AND
DATEDIFF(year, HPDATUM, HPDATUM_NEXT) >= 1;
如果只想检查一个方向,则删除两个超前/滞后检查之一。另外,如果您只想查看单笔费用,请在CTE中添加一个WHERE
子句。
答案 1 :(得分:0)
使用窗口函数LAG()获取HPDATUM的上一行值并进行比较
CTE AS
(
SELECT t.CHARGE, t.HPDATUM,
PREV_HPDATUM = LAG (t.HPDATUM) OVER (ORDER BY HPDATUM)
FROM dbo.table123 t
WHERE t.CHARGE = '8811985'
)
SELECT CHARGE, HPDATUM
FROM CTE
WHERE PREV_HPDATUM IS NULL
OR HPDATUM > DATEADD(YEAR, 1, PREV_HPDATUM)