繁体   English   中英

SQL | 根据每列的日期值进行计数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM