Как получить первое non-NULL значение в группе для данного поля?

Ссылка скопирована
1 ответ

Поясню.
Например, у нас имеется некоторый SELECT ... GROUP BY.
Необходимо для каждой группы получить первое ненулевое значение для данного поля (не входящего в поля группировки). Очевидно, предполагается некоторый ORDER BY внутри групп.
Пусть имеется такая таблица:
client_id massage dttm
1 NULL 2022-01-01 05:12:12
1 hi 2022-01-01 05:12:15
1 I want to fuck 2022-01-01 05:12:18
3 NULL 2022-01-02 05:12:12
3 NULL 2022-01-02 05:12:15
3 ohhh 2022-01-02 05:12:18
4 nice dick pic! 2022-01-03 05:12:18

Запрос должен вернуть:
client_id massage dttm
1 I want to fuck 2022-01-01 05:12:18
3 ohhh 2022-01-02 05:12:18
4 nice dick pic! 2022-01-03 05:12:18

Дополнительно:

FIRST_VALUE()
В выражении сортировки окна первым поставить column IS NULL.

SELECT DISTINCT         client_id,        FIRST_VALUE(massage)             OVER (PARTITION BY client_id                   ORDER BY massage IS NULL, dttm) massage FROM test

SELECT DISTINCT client_id, FIRST_VALUE(massage) OVER (PARTITION BY client_id ORDER BY massage IS NULL, dttm) massage FROM test

Если СУБД не поддерживает прямого ORDER BY massage IS NULL, dttm, то ORDER BY CASE WHEN massage IS NULL THEN 1 ELSE 0 END, dttm.

https://dbfiddle.uk/?rdbms=mysql_8.0&rdbms2=sqlser...

Ответы:

Возможно, если вы приведете пример полного запроса с уточнениями, то помочь вам будет легче.
Может быть вам подойдет постфильтрация с помощью HAVING, а может нужно будет функию COALESCE применить. Без подробностей не ясно.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Для того чтобы получить первое non-NULL значение в группе для данного поля, можно использовать стандартный SQL запрос с функцией `COALESCE` или `CASE`.

Например, если у нас есть таблица `users` с полями `id`, `name` и `age`, и мы хотим получить первое non-NULL значение поля `age` для каждого пользователя, то запрос будет выглядеть следующим образом:

SELECT id, name, COALESCE(age1, age2, age3) AS first_non_null_age
FROM (
    SELECT id, name,
           MAX(CASE WHEN age IS NOT NULL THEN age END) AS age1,
           MAX(CASE WHEN age IS NOT NULL THEN NULL ELSE age END) AS age2,
           MAX(age) AS age3
    FROM users
    GROUP BY id, name
) AS subquery;

SELECT id, name, COALESCE(age1, age2, age3) AS first_non_null_age FROM ( SELECT id, name, MAX(CASE WHEN age IS NOT NULL THEN age END) AS age1, MAX(CASE WHEN age IS NOT NULL THEN NULL ELSE age END) AS age2, MAX(age) AS age3 FROM users GROUP BY id, name ) AS subquery;

Этот запрос сначала создает подзапрос, в котором используются функции `MAX` и `CASE` для определения первого non-NULL значения для каждого пользователя. Затем основной запрос использует функцию `COALESCE`, чтобы выбрать первое non-NULL значение из полученных результатов.

Таким образом, данный запрос позволит получить первое non-NULL значение поля `age` для каждого пользователя в группе.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно