![](/img/trans.png)
[英]Query to return dynamic number of rows using SQL in 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.