Я пытаюсь найти способ выбрать минимум или максимум из диапазона данных на основе этих условий:
Пример таблицы: продано_выход
Ожидаемый результат:
Я попробовал это, но это не работает.
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
@Dale K Спасибо за ваш комментарий. Я обновил образец данных для второго желаемого результата.
Как и во всех 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.
Если вы предоставляете DDL+DML, то есть DBFiddle, вам будет намного проще помогать людям.