2016-11-05 2 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)'. Не знаю, работает ли это в других СУБД. – 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

Вы можете использовать случай, когда

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

В любом случае у меня есть обновление answer .. – scaisEdge

Смежные вопросы