![](/img/trans.png)
[英]how to count the values of the values of the dynamically added table rows using jquery
[英]SQL: find count of duplicates, new values added, and values removed in the same table (dynamically)
我希望使用SQL完成以下目標:
1)找到重復記錄的數量
根據列(即“快照日期”)提取重復值的數量,並將其與上一個日期進行比較
2)查找添加的記錄數
3)查找已刪除的記錄數
當前表
snapshot_date | unique ID
2018-08-15 1
2018-08-15 2
2018-08-15 3
2018-08-15 4
2018-08-15 5
2018-08-16 1
2018-08-16 3
2018-08-16 4
2018-08-16 6
2018-08-16 7
2018-08-16 8
2018-08-16 9
2018-08-17 3
2018-08-17 8
2018-08-17 10
2018-08-17 11
2018-08-17 12
2018-08-17 13
所需的表
snapshot date | count | # of dupe from previous date | sum of ID added | sum of ID removed
2018-08-15 5 N/A N/A N/A
2018-08-16 7 3 4 2
2018-08-17 6 2 4 5
如果有人知道腳本到達所需的表格,我會非常感激! 提前謝謝你!
如果你使用MySQL,至少在早期版本中,它不支持分析函數LEAD和LAG,那么一種方法是進行一系列自連接,然后進行聚合以獲得所需的結果:
SELECT
t1.snapshot_date,
t1.count,
t1.previous_dupe,
t1.num_added,
t2.num_subtracted
FROM
(
SELECT
t1.snapshot_date,
COUNT(*) AS count,
COUNT(t2.snapshot_date) AS previous_dupe,
COUNT(CASE WHEN t2.snapshot_date IS NULL THEN 1 END) AS num_added
FROM yourTable t1
LEFT JOIN yourTable t2
ON t1.snapshot_date = DATE_ADD(t2.snapshot_date, INTERVAL 1 DAY) AND
t1.uniqueID = t2.uniqueID
GROUP BY t1.snapshot_date
) t1
LEFT JOIN
(
SELECT
DATE_ADD(t1.snapshot_date, INTERVAL 1 DAY) AS snapshot_date,
COUNT(CASE WHEN t2.snapshot_date IS NULL THEN 1 END) AS num_subtracted
FROM yourTable t1
LEFT JOIN yourTable t2
ON t1.snapshot_date = DATE_SUB(t2.snapshot_date, INTERVAL 1 DAY) AND
t1.uniqueID = t2.uniqueID
GROUP BY t1.snapshot_date
) t2
ON t1.snapshot_date = t2.snapshot_date;
注意:我的結果與您的期望之間存在輕微差異,部分原因是您自己的數學錯誤,部分原因是查詢中的邏輯工作方式。 我報告在最早的記錄中添加了5個新ID,因為從概念上講,沒有先前的記錄,並且所有5個值都是技術新的。
這個問題特別難看,因為我們需要在兩個獨立的子查詢中以不同的方向自我連接兩次。
這是我的看法。 基於SQL Server
SELECT snapshot_date = COALESCE(c.snapshot_date, DATEADD(day, 1, p.snapshot_date)),
[count] = COUNT(c.snapshot_date),
dup_from_prev_day = SUM(CASE WHEN c.snapshot_date is not null
AND p.snapshot_date is not null
THEN 1 END),
sum_of_id_added = SUM(CASE WHEN c.snapshot_date is not null
AND p.snapshot_date is null
THEN 1 END),
sum_of_id_removed = SUM(CASE WHEN c.snapshot_date is null
AND p.snapshot_date is not null
THEN 1 END)
FROM yourTable c -- current
FULL OUTER JOIN yourTable p -- previous
ON c.snapshot_date = DATEADD(DAY, 1, p.snapshot_date)
AND c.uniqueID = p.uniqueID
GROUP BY COALESCE(c.snapshot_date, DATEADD(DAY, 1, p.snapshot_date))
HAVING COUNT(c.snapshot_date) > 0
/* RESULT :
snapshot_date count dup_from_prev_day sum_of_id_added sum_of_id_removed
2018-08-15 5 NULL 5 NULL
2018-08-16 7 3 4 2
2018-08-17 6 2 4 5
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.