mysql - MYSQL 计数唯一行,即使计数为零,对于单个表
问题描述
我有一个像这个 SQLfiddle 一样的表 - http://www.sqlfiddle.com/#!9/3b6f8a/1
我尝试计算访问的唯一次数,但我还需要计数为零的日期。在示例结果中,您可以看到日期为 2019-07-24 的 .bid 缺少 0 结果,而 25 日的结果类似。
我搜索了stackoverflow,只找到了使用LEFT JOIN 的多个表的解决方案。我不知道如何将它应用于单个表。
下面是我没有显示零值的工作查询。
SELECT COUNT(DISTINCT `hash`) wizyt, DATE(timestamp) AS timestamp, CASE
WHEN url LIKE '%.bid%' THEN 'bid'
WHEN url LIKE '%.online%' THEN 'online'
END AS landing
FROM `tracking_actions`
WHERE `action` = 'w90|landing-visit'
GROUP BY DATE(timestamp), landing ORDER BY timestamp
请帮助:)
解决方案
问题是 - 在 SQL 中,您通常不能无中生有地创建行。如果您有一组行,那么您可以通过各种方式(如group by
orwhere
或having
)减少它,或者您可以将它与另一组行相乘(使用各种join
)。但是您不能凭空创建行,而这正是您想要做的。如果某个日期没有活动,那么您将没有任何行,也无法获得该日期的行。
因此,从概念上讲,有两种方法可以尝试解决这个问题。更通用的是创建一个包含所有日期的日历表。或者可能是三个表years
,你可以months
一起获得实际日期(尽管这有点棘手)。然后,当每个日期都有一行时,您可以将实际数据加入到该行中,您将得到零。days
join
或者,您需要查看特定于 DB 的 SQL 扩展。
MariaDB 有可以执行此操作的通用表表达式(请参阅此相关问题以获取灵感:How do I make a row generator in MySQL?)
它还有一个“序列存储引擎”,可以创建带有数字序列的伪表。这些可以转换为日期。
对于 MySQL 本身,我不知道可以使用什么。仔细阅读文档,也许您会发现一些可以生成行并可以对其进行调整的内容。
最后但同样重要的是,还可以选择不为此使用 SQL。在获得不完整的数据集后,用您选择的编程语言(无论如何您可能正在这样做)对其进行处理并填补空白。
推荐阅读
- flutter - 颤振检查字符串是否以 RegExp 开头
- mysql - 如何选择满足条件的X个连续行数
- android - java.lang.IllegalArgumentException:ByteBuffer 不是有效的平面缓冲区模型
- node.js - 发布请求后快递nodejs正文为空
- r - 将标签添加到注释矩形ggplot
- javascript - 我的 google 脚本执行速度很慢,但它已经从 107 行压缩到了 1 行。我将如何使它更具响应性?
- javascript - NodeJS setTimeout 循环
- android - Kotlin:如何从 Button 类中获取背景颜色?
- pandas - 如何确保 Pandas 列中字符串的 HH:MM:SS 时间格式
- python - 如何制作二维截距函数?