2016-11-05 86 views
1

行的數量我有簡單的表:顯示有相同的價值觀

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 │ 
└─────────┴────────────┴────────┴────────┴────────┴────────┴───────────┘ 
+0

我想你應該使用'COUNT'而不是'SUM'。在PostgreSQL中,你可以通過追加'OR NULL'來計算布爾表達式。 'COUNT(roundAge(年齡)= 17或NULL)'。不知道這是否適用於其他DBMS。 – clemens

+0

在Clickhouse' COUNT'不接受參數:( – blits

回答

0

對不起,我不能爲你提供魔法。 但是,這看起來更好:

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 

我只是用Combinator的 「如果」。我跳它可以幫助你。

0

可以使用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 
+0

這是無用的,因爲我仍然指定了值。如果我不知道'Age'中的可能值怎麼辦? – blits

+0

你有一個範圍? – scaisEdge

+0

無論如何,我已經更新答案.. – scaisEdge