给定时间范围仅输出唯一行

时间:2019-03-19 07:09:17

标签: sql-server tsql

因此,我想拥有所有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

2 个答案:

答案 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)