代码之家  ›  专栏  ›  技术社区  ›  niclas_4

只输出给定时间范围的唯一行

  •  0
  • niclas_4  · 技术社区  · 7 年前

    所以我想要所有的 CHARGE 在哪里 HPDATUM 到下一个是一年多前。

    当前查询如下所示:

    SELECT DISTINCT CHARGE, HPDATUM FROM dbo.table123 WHERE CHARGE = '8811985' GROUP BY CHARGE, HPDATUM

    这是一个对 充电 充电

    这是上述查询的示例输出:

    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 回复  |  直到 7 年前
        1
  •  4
  •   Tim Biegeleisen    7 年前

    我们可以试着用 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;
    

    如果您只想检查一个方向,则删除两个超前/滞后检查中的一个。另外,如果你只想看到一个单一的收费,然后添加一个 WHERE 条款。

        2
  •  0
  •   Squirrel    7 年前

    使用窗口函数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)