Sql 按预定义日期范围分组
在存储在其他表中的预定义时间段内,如何计算表中的发生次数 我有两张桌子:Sql 按预定义日期范围分组,sql,sql-server,group-by,Sql,Sql Server,Group By,在存储在其他表中的预定义时间段内,如何计算表中的发生次数 我有两张桌子: table1 +------------+---------+---------+ | Period | value 1 | value 2 | +------------+---------+---------+ | 2021-01-01 | 1234 | 45678 | | 2021-02-01 | 345 | 3456 | | 2021-03-01 | 34567 | 45678
table1
+------------+---------+---------+
| Period | value 1 | value 2 |
+------------+---------+---------+
| 2021-01-01 | 1234 | 45678 |
| 2021-02-01 | 345 | 3456 |
| 2021-03-01 | 34567 | 45678 |
+------------+---------+---------+
table 2
+------------+---------+
| Date | boolean |
+------------+---------+
| 2021-01-03 | 1 |
| 2021-01-06 | 0 |
| 2021-02-05 | 1 |
| 2021-02-13 | 1 |
| 2021-03-06 | 1 |
+------------+---------+
我想要下面的结果
+------------+---------+---------+-------|
| Period | value 1 | value 2 | count |
+------------+---------+---------+-------+
| 2021-01-01 | 1234 | 45678 | 1 |
| 2021-02-01 | 345 | 3456 | 2 |
| 2021-03-01 | 34567 | 45678 | 1 |
+------------+---------+---------+-------+
我试过这样的方法
SELECT t1.*, SUM(t2.boolean) as count
FROM table1 t1
LEFT JOIN table2 t2
WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
你很接近。要在
FROM
子句中定义表的关系,您不需要WHERE
子句,您需要ON
子句:
SELECT t1.*, SUM(t2.boolean) as count
FROM table1 t1
LEFT JOIN table2 t2
ON t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
此外,由于您要在SELECT中使用SUM()
进行聚合,因此您需要提供一个groupby
来告诉数据库要对哪些列进行分组(每个未使用类似SUM()
的函数进行聚合的列):
因为您需要第一个表中的所有列,所以我建议使用关联子查询:
SELECT t1.*,
(SELECT SUM(t2.boolean) as count
FROM table2 t2
WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
) as count
FROM table1 t1;
根据数据和索引的性质,这也可能更快——避免外部聚合通常是一种胜利
SELECT t1.*,
(SELECT SUM(t2.boolean) as count
FROM table2 t2
WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
) as count
FROM table1 t1;