@MIsix

Как написать SQL запрос для среза непустых значений?

Есть таблица, хранящая изменения вида:
----------------------------
id|key|value1|value2|value3|
----------------------------
1 |91 |a     |      |f     |
2 |91 |      |c     |      |
3 |95 |      |d     |g     |
4 |95 |b     |e     |      |


Как получить из нее единственную строку с последними по id непустыми значениями из всех столбцов для определенного ключа key?
То есть из примера получить запросом для key = 91 |a|c|f|, а для key = 95 |b|e|g|.

Прям суть вопроса:
Существует ли вообще в SQL функция для получения последнего непустого значения столбца?

Прим:
Вариант с 2мя таблицами в рамках данного вопроса не имеет смысла, вопрос не в структуре хранения.
  • Вопрос задан
  • 300 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Общее решение:
SELECT DISTINCT
       key,
       FIRST_VALUE(value1) OVER (PARTITION BY key 
                                 ORDER BY CASE WHEN value1 IS NULL 
                                               THEN 1 
                                               ELSE 0 END, id DESC) AS value1,
       FIRST_VALUE(value2) OVER (PARTITION BY key 
                                 ORDER BY CASE WHEN value2 IS NULL 
                                               THEN 1 
                                               ELSE 0 END, id DESC) AS value2,
       FIRST_VALUE(value3) OVER (PARTITION BY key 
                                 ORDER BY CASE WHEN value3 IS NULL 
                                               THEN 1 
                                               ELSE 0 END, id DESC) AS value3
FROM tablename
-- WHERE key IN ( {список значений} )


Однако я полностью согласен с тем, что сказал Роман Юрьевич Ипатьев,
переписать таблицу в нормальную форму
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Select t2.* from t1 join t2 on t2.t1_id=t1.id 
where t1.key=95


Это единственный осмысленный ответ на такой вопрос.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала надо определиться с термином "последний", поскольку в SQL нет порядка строк за исключением заданного через ORDER BY. Скажем, пусть будет "с максимальным `id`.
SELECT `t`.`key`, `t1`.`value1`,
       `t2`.`value2`, `t3`.`value3`
  FROM (
    SELECT `key`, 
           MAX(IF(`value1` = '', -1, `id`)) AS `id1`,
           MAX(IF(`value2` = '', -1, `id`)) AS `id2`,
           MAX(IF(`value3` = '', -1, `id`)) AS `id3`
      FROM `table`
      GROUP BY `key`
  ) AS `t`
  LEFT JOIN `table` AS `t1` ON `t1`.`id` = `t`.`id1`
  LEFT JOIN `table` AS `t2` ON `t2`.`id` = `t`.`id2`
  LEFT JOIN `table` AS `t3` ON `t3`.`id` = `t`.`id3`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы