[英]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_number
為1
。 其次,我需要顯示每個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.