Выберите одну строку на значение индекса с максимальным значением столбца - PullRequest
2 голосов
/ 08 февраля 2011

С настройкой таблицы со следующими полями:

SKU, EVENTSTARTDATE, EVENTENDDATE, PRICE, (...etc...)

и содержит тысячи строк, вот примерные данные (даты указаны в ГГММДД, исключая код века):

1111111, 101224, 101231, 10.99
1111111, 110208, 110220, 9.99
1111111, 110301, 110331, 8.99
2222222, 101112, 101128, 15.99
2222222, 101201, 110102, 14.99
etc

Я бы хотел, чтобы оператор SELECT возвращал одну строку для каждого SKU с максимальным EVENTSTARTDATE без предложения WHERE, изолирующего конкретный SKU или неполный поднабор SKU (требуемый оператор SELECT должен возвращать одну строку для каждого SKU для всех SKU). В конечном итоге я хотел бы добавить критерии, согласно которым начальная дата меньше или равна текущей дате, а конечная дата больше или равна текущей дате, но сначала нужно где-то начать.

Пример желаемых результатов (на данный момент только максимальная дата):

1111111, 110301, 110331, 8.99
2222222, 101201, 110102, 14.99
etc.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

В последних версиях DB2 вы можете использовать аналитическую функцию ROW_NUMBER ()

SELECT * 
FROM (
    SELECT 
        tablename.*, 
        ROW_NUMBER() OVER (PARTITION BY sku 
                           ORDER BY eventstartdate DESC) As RowNum
        FROM tablename) X 
WHERE X.RowNum=1

Для каждого раздела (группы SKU) данные нумеруются по строкам после order by eventstartdate desc, поэтому 1,2,3, ... начиная с 1 для последней EventStartDate.Затем предложение WHERE выбирает только самые последние версии для SKU.

1 голос
/ 08 февраля 2011

Ознакомьтесь с предложениями GROUP BY и HAVING.

select sku, max(eventstartdate)
FROM TABLE
group by sku
having eventstartdate <= sysdate

Редактировать: добавлен оператор HAVING

0 голосов
/ 23 октября 2016

другое решение

 select distinct f3.* 
 from  yourtable f1
 inner join lateral
       (
        select * from yourtable f2
        where f1.SKU=f2.SKU
        order by EVENTSTARTDATE desc, EVENTENDDATE desc
        fetch first rows only
        ) f3 on 1=1
...