【问题标题】:MySQL "fill up" missing values in histogramMySQL“填补”直方图中的缺失值
【发布时间】:2014-05-27 12:34:06
【问题描述】:

使用 SQL,我想创建一种直方图。数据本身已经以某种方式组织起来,这使得创建直方图变得简单直接。简化的查询基本上如下所示:

SELECT rank, COUNT(*) AS count FROM ranks GROUP BY rank ORDER BY rank;

这给了我一个如下表:

+------+-------+
| rank | count |
+------+-------+
| 0    | 20    |
| 1    | 15    |
| 2    | 9     |
| 6    | 3     |
| 9    | 2     |
+------+-------+

问题:为了进一步处理数据,我要求明确给出零箱。在这种情况下(知道我的排名从 0 到 9),我需要一个有 10 行的表(例如排名 3、4、5、7 和 8 将在表中明确说明计数 0)。

我考虑过创建一个以排名为值的临时表并将我的查询连接到该表,但这似乎并不特别优雅。有没有更好的方法? (避免复杂的程序)。

【问题讨论】:

  • 不。没有“优雅”的方式。 sql dbs 无法凭空生成数据。如果您对某个特定群体一无所有,那么您将一无所获。
  • 有没有与ranks表相关的表?你的散文确实提到了零垃圾箱。这是怎么回事?
  • @DanBracuk 在原来的数据库中,查询比较复杂,结果是多表join的。简短描述的用例:我有一个带有相关/不相关项目的注释数据集,我想创建统计信息,在特定排名上找到多少相关项目。由于我必须执行多个此类查询并将结果传输到另一个应用程序以进行进一步处理,因此列出零箱将使我的生活变得更加轻松。

标签: mysql sql histogram


【解决方案1】:

我会这样做,只要确保将对 anyTable 的引用更改为包含比您希望生成的排名数更多的行的任何表。

它仍然使用连接,但不需要临时表。

问候,

詹姆斯

CREATE TABLE ranks
SELECT 0 rank, 20 count
    UNION ALL
SELECT 1 rank, 15 count
    UNION ALL
SELECT 2 rank, 9 count
    UNION ALL
SELECT 6 rank, 3 count
    UNION ALL
SELECT 9 rank, 2 count;

SET @VCounter := -1;

SELECT A.rank, B.count FROM
    (SELECT @VCounter := @VCounter + 1 rank FROM anyTable WHERE @VCounter < 10) A
LEFT JOIN
    ranks B
ON A.rank = B.rank
ORDER BY A.rank;

如果您对实施有任何问题,请告诉我,

问候,

詹姆斯

【讨论】:

  • +1 但 anyTable 应该有超过 10 条记录
  • @StanislavL,你说得对,这是我今天早些时候发布的这种方法的一个弱点,如果我想出更好的方法,我会在这里更新我的答案。
猜你喜欢
  • 2016-07-23
  • 2021-09-17
  • 2019-06-08
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多