Как подсчитать (ОТЛИЧИТЬ a, b) после GROUP BY c - PullRequest
0 голосов
/ 28 июня 2018

У меня есть таблица из трех столбцов: newspaper, person, page. Один человек может прочитать страницу несколько раз, что означает, что у нас может быть такая таблица:

newspaper   person  page
---------   ------  ----
NY Times      A      1
NY Times      A      1
NY Times      A      1
NY Times      A      2
NY Times      B      8
NY Times      B      9
NY Times      B      9
WashPost      A      1
WashPost      B      1

Я хочу COUNT для каждой газеты (= GROUP BY newspaper), сколько раз кто-то читает страницу. Чтобы уточнить, что я имею в виду, для приведенной выше таблицы ввода результат должен выглядеть следующим образом:

newspaper     COUNT
---------   --------
NY Times        4   =>  (A,1) (A,2) (B,8) (B,9)
WashPost        2   =>  (A,1) (B,1)

Моей первой попыткой был приведенный ниже запрос, который не разрешен sqlite, но уточняет, что мне нужно:

SELECT newspaper, COUNT(DISTINCT person, page)
FROM T 
GROUP BY newspaper

В качестве обходного пути я могу объединить столбцы person и page, используя ||, и запрос работает отлично, но я думал о лучшем решении.

SELECT newspaper, COUNT(DISTINCT person || page)
FROM T 
GROUP BY newspaper

1 Ответ

0 голосов
/ 28 июня 2018

Вам нужно distinct, чтобы избавиться от дубликатов, а затем count(*) строк для каждой газеты. Для этого мы используем подзапрос:

select newspaper, count(*) as reads_no
from (
  select distinct newspaper, person, page
  from t
) t
group by newspaper

Вы не должны объединять два поля и различать их, потому что если вы не используете какой-либо сумасшедший разделитель, который, как вы знаете, никогда не будет существовать в полях, вы можете отбросить некоторые значения. Смотрите пример ниже.

'aab' || 'xzy' = 'aa' || 'bxzy'
...