[英]SQL | Count based on each column's date value
我有 3 个表:
CustomerID | PromotionDate
1111 | 01-01-2020
2222 | 03-06-2021
3333 | 05-07-2021
4444 | 09-10-2020
CustomerID | WorkID
1111 | aaaa
1111 | bbbb
2222 | cccc
2222 | dddd
2222 | eeee
WorkID | StartDate
aaaa | 01-01-2020
bbbb | 01-02-2021
cccc | 05-07-2020
dddd | 06-08-2021
eeee | 03-07-2022
我想查找每个 CustomerID 的 WorkID 计数,其中 StartDate >= PromotionDate 对于该 CustomerID。
所以上面示例的结果应该是:
CustomerID | Count
1111 | 2
2222 | 2
3333 | 0
4444 | 0
如何做到这一点?
将表名替换为真实名称,除此之外应该可以正常工作。
SELECT table1.CustomerID, COALESCE(a.totalCount,0) counts FROM table1
LEFT JOIN (SELECT table1.CustomerID, COUNT(table3.WorkID) as totalCount
FROM table3
LEFT JOIN table2 ON table3.WorkID = table2.WorkID
LEFT JOIN table1 ON table2.CustomerID = table1.CustomerID
WHERE table3.StartDate >= table1.PromotionDate
GROUP BY table1.CustomerID ORDER BY table1.CustomerID ASC)a ON table1.CustomerID = a.CustomerID GROUP BY table1.CustomerID
我正在使用名为COUNT()
的聚合 function 来计算同一客户的相似出现次数。 GROUP BY
将相似的记录合并为一个并使用COUNT()
function。ORDER ORDER BY
用于按 CustomerID 对其进行排序
免责声明:我不使用 PostgreSQL,所以可能有更好的选择。 但是,一般方法是使用条件 SUM() 来计算StartDate >= PromotionDate
的记录数:
SELECT t1.CustomerId
, SUM( CASE WHEN t3.StartDate >= t1.PromotionDate THEN 1 ELSE 0 END ) AS "Count"
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.CustomerID = t2.CustomerID
LEFT JOIN Table3 t3 ON t2.WorkId = t3.WorkId
GROUP BY t1.CustomerId
结果:
客户ID | 总数 |
---|---|
1111 | 2个 |
2222 | 2个 |
3333 | 0 |
4444 | 0 |
db<> 在这里摆弄
这应该适用于 Redshift:
SELECT p.customerid
, count(s.startdate >= p.promotiondate OR NULL) AS total_count
FROM cust_promo p
LEFT JOIN cust_work w ON w.customerid = p.customerid
LEFT JOIN work_start s ON s.workid = w.workid
GROUP BY p.customerid;
db<> 在这里摆弄
假设workid
在表work_start
中是UNIQUE
的(这似乎是合理的)。
聚合FILTER
子句在现代 Postgres 中表现更好。 但是 Redshift 很久以前就没有跟上它的发展:
SELECT p.customerid
, count(*) FILTER (WHERE s.startdate >= p.promotiondate) AS total_count
FROM cust_promo p
LEFT JOIN cust_work w ON w.customerid = p.customerid
LEFT JOIN work_start s ON s.workid = w.workid
GROUP BY p.customerid;
看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.