Выберите минимум или максимум в зависимости от того, где существует повторяющееся значение

Я пытаюсь найти способ выбрать минимум или максимум из диапазона данных на основе этих условий:

  • Группировка по столбцам: location_cd, Machine_cd, Product_cd, температура.
  • Если несколько строк имеют одинаковое значение MAX(created_timestamp), выберите строку с MIN(data_source).
  • В противном случае просто выберите строку с MAX (created_timestamp).

Пример таблицы: продано_выход

location_cd машина_cd продукт_cd температура источник данных созданная_метка времени 0012345678 1234567890 123456 1 3 2024/06/10 15:30:15 0012345678 1234567890 123456 1 4 2024/06/10 15:30:15 0012345678 1234567890 654321 0 3 2024/06/10 14:50:15 0012345678 1234567890 654321 0 4 2024/06/10 15:00:15

Ожидаемый результат:

location_cd машина_cd продукт_cd температура источник данных созданная_метка времени 0012345678 1234567890 123456 1 3 2024/06/10 15:30:15 0012345678 1234567890 654321 0 4 2024/06/10 15:00:15

Я попробовал это, но это не работает.

SELECT machine_cd,
    location_cd,
    product_cd,
    temperature,
    case WHEN exists(
        SELECT machine_cd,
            location_cd,
            product_cd,
            temperature,
            created_timestamp,
            COUNT(*)
        From sold_out
        group by machine_cd,
            location_cd,
            product_cd,
            temperature,
            created_timestamp
        HAVING COUNT(*) > 1
    ) THEN MIN(data_source) ELSE MAX(created_timestamp) END
FROM sold_out
GROUP BY machine_cd,
    location_cd,
    product_cd,
    temperature

Если вы предоставляете DDL+DML, то есть DBFiddle, вам будет намного проще помогать людям.

Dale K 28.06.2024 06:52

@Dale K Спасибо за ваш комментарий. Я обновил образец данных для второго желаемого результата.

ninh_nguyen 28.06.2024 07:22
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как и во всех TOP 1 per group проблемах, вы можете просто создать раздел с номерами строк, упорядочить его в соответствии с вашими требованиями и использовать его для фильтрации нужных вам строк, например.

with cte as (
    select *
        , row_number() over (partition by location_cd, machine_cd, product_cd, temperature order by created_timestamp desc, data_source asc) rn
    from TestData
)
select location_cd, machine_cd, product_cd, temperature, data_source, created_timestamp
from cte
where rn = 1
order by location_cd, machine_cd, product_cd, temperature, data_source, created_timestamp;

БД Скрипка

Спасибо за помощь. Я рад, что эта проблема решена, и чувствую, что узнал кое-что интересное о SQL.

ninh_nguyen 28.06.2024 08:19

Другие вопросы по теме