簡體   English   中英

DATEDIFF()具有不同ROW_NUMBER的日期之間

[英]DATEDIFF() Between dates with different ROW_NUMBER

我有以下查詢:

SELECT 
   START_DATE
  ,ID
  ,USER
  ,ROW_NUMBER(PARTITION BY USER ORDER BY START_DATE) AS RN

FROM TABLE

帶來以下結果:

START_DATE   ID   USER   RN
2019-01-01   200  01     1
2019-01-10   450  01     2
2019-01-02   500  02     1

我只想顯示具有多個開始日期(行號1、2、3)的用戶,而排除僅具有row_number1 其次,我需要顯示每個Row_Number之間的DATEDIFF()

我以為將ROW_NUMBER包括在內,但是不知道該怎么做。 它可能需要一個新的解決方案。 看起來像的示例是:

START_DATE  USER   datediff
2019-01-01  01     10
WITH TMP AS (
    SELECT 
       START_DATE
      ,ID
      ,USER
      ,LAG(START_DATE) OVER ( PARTITION BY USER ORDER BY START_DATE) AS LAST_START_DATE
      ,CASE WHEN MIN(START_DATE ) OVER ( PARTITION BY USER ) = 
                 MAX(START_DATE) OVER ( PARTITION BY USER) THEN 1
            ELSE 0
        END ExcludeIfOnlyNonUnique
      FROM TEST_DATA)
SELECT TMP.START_DATE,
       TMP.ID,
       TMP.USER,
       DATEDIFF(TMP.START_DATE, TMP.LAST_START_DATE) START_DATE_DIFF
  FROM TMP
 WHERE ExcludeIfOnlyNonUnique = 0;

有許多方法可以做到這一點,但是更優雅的方法之一是使用Microsoft SQL Server函數的超前和滯后。 這些函數使您可以通過方法訪問分區中前一行和后一行中的值。 在這里閱讀它們:

潛在客戶: https//docs.microsoft.com/zh-CN/sql/t-sql/functions/lead-transact-sql?view = sql-server-2017

滯后: https ://docs.microsoft.com/zh-cn/sql/t-sql/functions/lag-transact-sql ? view = sql-server-2017

我將使用CTE並兩次加入查詢。

WITH MY_QUERY AS (
  SELECT 
    START_DATE, 
    ID, 
    USER,
    ROW_NUMBER(PARTITION BY USER ORDER BY START_DATE) AS RN
  FROM SOMETABLE
), MY_ID AS (
  SELECT DISTINCT USER FROM MY_QUERY
)
SELECT Q1.START_DATE, Q1.USER, DATEDIFF(Q1.START_DATE, Q2.START_DATE) AS DIFF
FROM MY_ID ID
JOIN MY_QUERY Q1 ON ID.USER = Q1.USER AND Q1.RN = 1
JOIN MY_QUERY Q2 ON ID.USER = Q2.USER AND Q2.RN = 2

試試下面的腳本-

WITH CTE(START_DATE, ID, [USER], RN)
AS
(
    SELECT 
    START_DATE
    ,ID
    ,USER
    ,ROW_NUMBER(PARTITION BY USER ORDER BY START_DATE) AS RN
)

SELECT MIN(START_DATE) [START_DATE], 
[USER],
DATEDIFF(DD,MIN(START_DATE),MAX(START_DATE))+1 [datediff]
FROM CTE
GROUP BY [USER]
HAVING MAX(RN) > 1

您不需要row_number() 您想要count()

select t.*
from (select . . . ,
             count(*) over (partition by user) as cnt
      from t
     ) t
where cnt > 1;

當然,您仍然可以在結果集中包含row_number()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM