簡體   English   中英

使用 SQL Server 2012 如何遍歷未知行數並計算日期差異

[英]Using SQL Server 2012 how to iterate through an unknown number of rows and calculate date differences

如果每個 ID 有兩個或多個日期,我需要計算平均天數:date1 和 date2、date2 和 date3 等之間的天數。輸出需要是每個 ID 的每個間隔之間的平均天數。 我正在尋找一個解決方案,它遍歷每個 ID 的每個日期,然后平均天數

我可以創建一個行號並按 id 進行分區,但在實際數據中,每個 ID 最多可以有 20 行。

CREATE TABLE #ATABLE(
ID   INTEGER  NOT NULL  
,DATE DATE  NOT NULL
);
INSERT INTO #ATABLE(ID,DATE) VALUES (1,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/10/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/20/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (2,'1/30/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/1/2019');
INSERT INTO #ATABLE(ID,DATE) VALUES (3,'1/10/2019');

--get avg days between orders

DROP TABLE #ATABLE

上面的輸出將是:

ID  AvgDatediff
1   Null
2   10
3   9

您可以使用lag獲取上一行(每行),然后找到它與當前行之間的差異。 然后,您可以將它們平均化:

SELECT   id, AVG(diff)
FROM     (SELECT id,
                 DATEDIFF(DAY, date, LAG(date) OVER (PARTITION BY id 
                                                     ORDER BY date DESC)) AS diff
          FROM #atable) t
GROUP BY id;

獲得平均差異的最簡單方法是:

SELECT id, DATEDIFF(DAY, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0)
FROM  #atable) t
GROUP BY id;

注意:如果您不想要整數平均值,您可能需要* 1.0

換句話說,平均差異是最晚日期減去最早日期除以計數減一。 嘗試一下。 有用。

SELECT id, AVG(DayDiff)
FROM (
    SELECT id,
    DATEDIFF(dd, date, LEAD(date) OVER (PARTITION BY id ORDER BY date)) AS DayDiff
    FROM #atable
) as AA
GROUP BY id;

LEAD(source_column) ==> 根據 order by 子句選擇下一個數據,即這里的日期。

暫無
暫無

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

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