Sql 显示具有相同值的行数

Sql 显示具有相同值的行数,sql,clickhouse,Sql,Clickhouse,我有一张简单的桌子: 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' =

我有一张简单的桌子:

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 │
└─────────┴────────────┴────────┴────────┴────────┴────────┴───────────┘
您可以在以下情况下使用CASE

  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
您可以在以下情况下使用CASE

  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

对不起,我不能给你魔法。 但是,这看起来更好:

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

我刚才用了组合词“如果”。我希望这能对你有所帮助。

对不起,我不能给你魔法。 但是,这看起来更好:

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

我刚才用了组合词“如果”。我希望这能对您有所帮助。

我认为您应该使用
COUNT
而不是
SUM
。在PostgreSQL中,您可以通过追加
或NULL来计算布尔表达式,例如
计数(舍入(年龄)=17或NULL)
。不知道这是否适用于其他DBMS。在Clickhouse中,
COUNT
不接受参数:(我认为您应该使用
COUNT
而不是
SUM
。在PostgreSQL中,您可以通过添加
或NULL
来计算布尔表达式,例如
COUNT(舍入(年龄)=17或NULL)
。不知道这是否适用于其他DBMS。在Clickhouse
COUNT中,
不接受参数:(这没用,因为我还需要指定值。如果我不知道
Age
中可能的值怎么办?你有一个范围吗?。好的,如果我需要使用
IP
/
Country
列而不是
Age
列怎么办?我不知道预期的值。你可以对每个列使用相同的值。结果是基于或进行评估的。)数据的自然顺序..键入,,,但这似乎是另一个答案..它没有用,因为我仍然需要指定值。如果我不知道
Age
中可能的值怎么办?您有一个范围?好的,如果我需要使用
IP
/
国家
列而不是
Age
,我不知道预期的值。是一样的吗您可以对每列使用between。结果是根据数据的自然顺序进行计算的..键入,,,但这似乎是另一个答案。。