Как считать данные SQL, но также есть поле, которое может присутствовать или нет? - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь определить правильный запрос SQL для группировки данных, но также включить логическое значение (ДА / НЕТ), если хотя бы для одной сгруппированных строк имеет определенное значение.

Вот конкретный пример, который поможет визуализировать:

Допустим, у меня есть такие данные, возможно, в таблице под названием "эксперименты" с такими полями:

id, experiment_name, user_id, created_at, completed_at

И скажемУ меня есть эти данные:

1, "test experiment", 23, 2019-09-10, NULL

2, "test experiment", 17, 2019-09-15, NULL

3, "test experiment", 23, 2019-09-18, 2019-09-19

4, "test experiment", 23, 2019-09-19, NULL

Я хочу написать SQL-запрос, который делает group_by user_id, чтобы я мог иметь счетчик, но также включает в себя некоторое логическое значение того, включала ли хотя бы одна из их строкЗначение complete_at.

Таким образом, я не могу просто сделать:

SELECT user_id, count(*), completed_at from db group by user_id, completed_at;

Это заканчивается примерно так:

user_id  count(*)   completed_at

23            2       NULL

23            1       2019-09-19

17            1       NULL

Мне нужен какой-то запрос, которыйПозвольте мне закончить что-то вроде:

user_id     count(*)    did_complete?

23              3          TRUE

17              1          FALSE

Но я нахожусь в тупике с этой стороны.Я попытался найти SO здесь, но я не могу понять, как даже сформулировать это как короткий, доступный для поиска вопрос.

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы используете агрегатную функцию с условным выражением, чтобы проверить, имеет ли хотя бы одна запись в группе ненулевое значение completed_at:

SELECT 
    user_id, 
    COUNT(*) cnt, 
    MAX(CASE WHEN completed_at IS NOT NULL THEN 1 ELSE 0 END) did_complete
FROM experiments
GROUP BY user_id

Я обычно предпочитаю использовать 0 / 1, а не TRUE/FALSE, поскольку числа гораздо более переносимы в разных СУБД, чем булевы.

0 голосов
/ 20 сентября 2019

Вы должны выбрать столбец, который можно обнулять как да / нет, и затем группировать по этому полю. Что-то вроде

ВЫБЕРИТЕ user_id, count (*), переключите, если равно null завершено_, а затем 0 или 1 завершится как nullableField из группы БД поuser_id, nullableField;

Также посмотрите на этот вопрос Как мне вернуть мои записи, сгруппированные по NULL и NOT NULL?

0 голосов
/ 20 сентября 2019
SELECT MAX(CASE WHEN completed_at IS NOT NULL THEN 1 ELSE 0 END) AS HasCompleted,
count(*) AS CNT, 
MAX(completed_at) LastCompleted 
from db 
group by user_id; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...