如何创建一个 SQL select 来创建范围内的所有数据并计算出现次数
How to create a SQL select that creates all data for a range and counts occurences
我想将数据合并到一个 table 中,其中记录了事件在特定日期发生时的记录,并创建了包含完整日期范围数据的输出,其中每个人每个日期的事件数已计算在内。
例如,如果我有一个源 table 包含这样的数据:
neil 01-05-2015
john 02-05-2015
neil 01-05-2015
neil 02-05-2015
jane 03-05-2015
一秒 table 包含所有日期:
01-05-2015
02-05-2015
03-05-2015
04-05-2015
如何将它们结合起来以创建所需的输出?
neil 01-05-2015 2
neil 02-05-2015 1
neil 03-05-2015 0
neil 04-05-2015 0
john 01-05-2015 0
john 02-05-2015 1
john 03-05-2015 0
john 04-05-2015 0
jane 01-05-2015 0
jane 02-05-2015 0
jane 03-05-2015 1
jane 04-05-2015 0
我已经尝试了各种完全连接,但似乎没有什么能完全满足我的需要,我想知道单独使用 SQL 是否可行。
首先使用 CROSS JOIN
在日期和人之间进行完全叉积。然后使用 LEFT JOIN
计算所有匹配项。
SELECT s1.name, d.date, IFNULL(COUNT(s2.name), 0)
FROM Dates AS d
CROSS JOIN (SELECT DISTINCT name FROM Source) AS s1
LEFT JOIN Source AS s2 ON s1.name = s2.name AND d.date = s2.date
GROUP BY s1.name, d.date
我想将数据合并到一个 table 中,其中记录了事件在特定日期发生时的记录,并创建了包含完整日期范围数据的输出,其中每个人每个日期的事件数已计算在内。
例如,如果我有一个源 table 包含这样的数据:
neil 01-05-2015
john 02-05-2015
neil 01-05-2015
neil 02-05-2015
jane 03-05-2015
一秒 table 包含所有日期:
01-05-2015
02-05-2015
03-05-2015
04-05-2015
如何将它们结合起来以创建所需的输出?
neil 01-05-2015 2
neil 02-05-2015 1
neil 03-05-2015 0
neil 04-05-2015 0
john 01-05-2015 0
john 02-05-2015 1
john 03-05-2015 0
john 04-05-2015 0
jane 01-05-2015 0
jane 02-05-2015 0
jane 03-05-2015 1
jane 04-05-2015 0
我已经尝试了各种完全连接,但似乎没有什么能完全满足我的需要,我想知道单独使用 SQL 是否可行。
首先使用 CROSS JOIN
在日期和人之间进行完全叉积。然后使用 LEFT JOIN
计算所有匹配项。
SELECT s1.name, d.date, IFNULL(COUNT(s2.name), 0)
FROM Dates AS d
CROSS JOIN (SELECT DISTINCT name FROM Source) AS s1
LEFT JOIN Source AS s2 ON s1.name = s2.name AND d.date = s2.date
GROUP BY s1.name, d.date