显示具有相同值的行数

Posted

技术标签:

【中文标题】显示具有相同值的行数【英文标题】:Show count of rows with same values 【发布时间】:2016-11-05 15:01:18 【问题描述】:

我有一张简单的桌子:

CREATE TABLE clicks
(
    Year UInt16,
    Week UInt8,
    Day UInt8,
    Month UInt8,
    ClickDate Date,
    ClickTime DateTime,
    AdvertId String,
    UserId String,
    Age UInt8,
    Country FixedString(2),
    Gender Enum8('male' = 1, 'female' = 2),
    Ip String
)
ENGINE = MergeTree(ClickDate, (Year, ClickDate), 8192);

是否可以在不重复值的情况下为一列添加一个唯一值的行总和并将它们按ClickDate 分组?例如。我有疑问:

SELECT 
    count() AS Summary, 
    ClickDate, 
    SUM(roundAge(Age) = 17) AS Age_17, 
    SUM(roundAge(Age) = 25) AS Age_25, 
    SUM(roundAge(Age) = 35) AS Age_35, 
    SUM(roundAge(Age) = 45) AS Age_45, 
    SUM(Age = 0) AS Age_empty
FROM clicks 
GROUP BY ClickDate

在这种情况下,我需要复制每个 Age

SUM(roundAge(Age) = 17) AS Age_17, 
SUM(roundAge(Age) = 25) AS Age_25

我怎样才能摆脱这种重复?我的期望:

来源数据:

┌──ClickDate─┬─RoundedAge─┐
│ 2016-10-09 │         17 │
└────────────┴────────────┘
┌──ClickDate─┬─RoundedAge─┐
│ 2016-10-09 │         25 │
│ 2016-10-09 │         17 │
│ 2016-10-09 │         45 │
│ 2016-10-09 │         45 │
│ 2016-10-09 │         35 │
│ 2016-10-09 │         45 │
│ 2016-10-09 │         25 │
│ 2016-10-09 │         18 │
│ 2016-10-10 │         25 │
│ 2016-10-10 │         25 │
└────────────┴────────────┘
┌──ClickDate─┬─RoundedAge─┐
│ 2016-10-09 │         17 │
└────────────┴────────────┘

需要的输出:

┌─Summary─┬──ClickDate─┬─Age_17─┬─Age_25─┬─Age_35─┬─Age_45─┬─Age_empty─┐
│      10 │ 2016-10-09 │      3 │      2 │      1 │      3 │         0 │
│       2 │ 2016-10-10 │      0 │      2 │      0 │      0 │         0 │
└─────────┴────────────┴────────┴────────┴────────┴────────┴───────────┘

【问题讨论】:

我认为你应该使用COUNT 而不是SUM。在 PostgreSQL 中,您可以通过附加 OR NULL 来计算布尔表达式,例如COUNT(roundAge(Age) = 17 OR NULL)。不知道这是否适用于其他 DBMS。 在 Clickhouse COUNT 不接受参数 :( 【参考方案1】:

对不起,我不能为你提供魔法。 但是,这样看起来更好:

SELECT 
    count() AS Summary, 
    ClickDate, 
    countIf(Age = 17), 
    countIf(Age = 25), 
    countIf(Age = 35), 
    countIf(Age = 45), 
    SUM(Age = 0) AS Age_empty
FROM clicks 
GROUP BY ClickDate

我刚刚使用了组合符“If”。我希望这可以帮助你。

【讨论】:

【参考方案2】:

你可以使用 CASE WHEN

  SELECT 
  count(*) AS Summary, 
  ClickDate, 
  sum( case when age = 17 then 1 else 0 end),  Age_17,
  sum( case when age = 25 then 1 else 0 end),  Age_25,   
  sum( case when age = 35 then 1 else 0 end),  Age_35,
  sum( case when age = 45 then 1 else 0 end),  Age_45,   
  sum( case when ifnull(age,0) = 0 then 1 else 0 end)  Age_Empty       
  FROM clicks 
  GROUP BY ClickDate

如果你需要范围,你可以在

之间使用
  SELECT 
  count(*) AS Summary, 
  ClickDate, 
  sum( case when age between 1  and 17 then 1 else 0 end),  Age_17,
  sum( case when age between 18 and 25 then 1 else 0 end),  Age_25,   
  sum( case when age between 26 and 35 then 1 else 0 end),  Age_35,
  sum( case when age between 36 and 45 then 1 else 0 end),  Age_45,   
  sum( case when ifnull(age,0) = 0 then 1 else 0 end)  Age_Empty       
  FROM clicks 
  GROUP BY ClickDate

【讨论】:

没用,因为我还有指定值。如果我不知道Age 中的可能值怎么办? 你有一个范围? . 好的,如果我需要使用IP / Country 列而不是Age 怎么办?我不知道预期值。 每列之间可以使用的相同。结果是基于或数据的自然顺序评估的..类型,,,但这似乎是另一个答案..

以上是关于显示具有相同值的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 或 javascript 计算具有特定值的行数?

计算其中的行数以找到特定值的行数[重复]

获取具有升序值的行数,如 1,2,3,直到发生中断,如表中的 1,2,3,7,8,9,10

Node.js:计算文件中的行数

如果它们具有相同的行数,如何根据 order_id 内部连接表

SqlSever基础 count 查询两个相关关联的表中的具有相同内容的行数