Показывать только строки с MAX (DATE) в запросе с несколькими объединениями - PullRequest
0 голосов
/ 22 мая 2019

Я хочу показать только одну строку для каждого STO_PART, ту, которая имеет MAX (TRL_DATE)

Я обнаружил, что ROW_NUMBER () ... может быть полезным, но я не могу сделать это правильно с запросом с объединениями.

SELECT      STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE

FROM        R5STOCK inner join R5PARTS on PAR_CODE = STO_PART and STO_PART_ORG = PAR_ORG
            inner join R5BINSTOCK on (BIS_STORE = STO_STORE and BIS_PART = STO_PART and BIS_PART_ORG = STO_PART_ORG)
            left join R5TRANSLINES on (TRL_PART = PAR_CODE and PAR_ORG = TRL_PART_ORG and TRL_TYPE = 'RECV')

WHERE       PAR_NOTUSED != '+' and BIS_QTY > 0 and STO_STORE in ('116-01', '138-05', '156-01', '216-01', '228-01', '282-01') 
            and TRL_STORE = STO_STORE and TRL_ORDER is not null

GROUP BY    STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE

Фактические результаты и ожидаемые результаты. Результаты с красной линией теперь должны быть показаны, потому что есть еще один STO_PART с более высоким TRL_DATE

description EDIT:

ROW_NUMBER запрос

SELECT      STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE

FROM        (SELECT STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE, ROW_NUMBER() over (partition by STO_PART ORDER BY TRL_DATE DESC) as MAX_DATE
            FROM R5STOCK inner join R5PARTS on PAR_CODE = STO_PART and STO_PART_ORG = PAR_ORG
            inner join R5BINSTOCK on (BIS_STORE = STO_STORE and BIS_PART = STO_PART and BIS_PART_ORG = STO_PART_ORG)
            left join R5TRANSLINES on (TRL_PART = PAR_CODE and PAR_ORG = TRL_PART_ORG and TRL_TYPE = 'RECV')

WHERE       PAR_NOTUSED != '+' and BIS_QTY > 0 and STO_STORE in ('116-01', '138-05', '156-01', '216-01', '228-01', '282-01') 
            and TRL_STORE = STO_STORE and TRL_ORDER is not null) X

WHERE MAX_DATE = 1

1 Ответ

0 голосов
/ 22 мая 2019

Создание виртуального поля для желаемого заказа в каждом разделе обычно работает в подобных случаях.

SELECT
    *
FROM
(
    SELECT      STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE,
            InvertedOrder = ROW_NUMBER() OVER PARTITION BY (STO_PART ORDER BY TRL_ORDER DESC)

    FROM        R5STOCK 
                inner join R5PARTS on PAR_CODE = STO_PART and STO_PART_ORG = PAR_ORG
                inner join R5BINSTOCK on (BIS_STORE = STO_STORE and BIS_PART = STO_PART and BIS_PART_ORG = STO_PART_ORG)
                left join R5TRANSLINES on (TRL_PART = PAR_CODE and PAR_ORG = TRL_PART_ORG and TRL_TYPE = 'RECV')

    WHERE       PAR_NOTUSED != '+' and BIS_QTY > 0 and STO_STORE in ('116-01', '138-05', '156-01', '216-01', '228-01', '282-01') 
                and TRL_STORE = STO_STORE and TRL_ORDER is not null

    GROUP BY    STO_PART, STO_PART_ORG, STO_STORE, BIS_BIN, TRL_ORDER, TRL_DATE
)
WHERE
    InvertedOrder=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...