Получить последнюю активность элемента как одну строку на элемент - PullRequest
0 голосов
/ 06 марта 2019

Эксперты, У меня есть запрос, который показывает мне последнее действие Item для таблиц Order и Invoice. Мне нужно сузить это еще больше, показав только один результат на Предмет - самое новое действие, будь то Заказ или Счет-фактура ...

SELECT A.ItemCode, A.ObjType, A.DocNum, A.LastActivity

FROM
(SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T1.[DocDate] AS 'LastActivity',
     ROW_NUMBER() OVER (PARTITION BY T0.ItemCode ORDER BY T0.DocEntry DESC) AS 'rownum'
 FROM INV1 T0
      INNER JOIN OINV T1 ON T0.[DocEntry]=T1.[DocEntry]
    WHERE T0.[ItemCode] = 'A00001_ test non inventory' OR T0.[ItemCode] = 'A00001'

 UNION ALL

 SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T1.[DocDate] AS 'LastActivity',
     ROW_NUMBER() OVER (PARTITION BY T0.ItemCode ORDER BY T0.DocEntry DESC) AS 'rownum'
 FROM RDR1 T0
    INNER JOIN ORDR T1 ON T0.[DocEntry]=T1.[DocEntry]

    WHERE T0.[ItemCode] = 'A00001_ test non inventory' OR T0.[ItemCode] = 'A00001'
    ) A
WHERE A.rownum=1;

1 Ответ

0 голосов
/ 06 марта 2019

Переместите row_number во внешний запрос и оберните все это в другой запрос:

SELECT A.ItemCode, A.ObjType, A.DocNum, A.LastActivity
FROM
(
    SELECT A.ItemCode, A.ObjType, A.DocNum, A.LastActivity,
            ROW_NUMBER() OVER (PARTITION BY ItemCode ORDER BY DocEntry DESC) AS 'rownum'

    FROM
    (
        SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T0.[DocEntry], T1.[DocDate] AS 'LastActivity'
        FROM INV1 T0
        INNER JOIN OINV T1 
            ON T0.[DocEntry]=T1.[DocEntry]
        WHERE T0.[ItemCode] = 'A00001_ test non inventory' 
        OR T0.[ItemCode] = 'A00001'

        UNION ALL

        SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T0.[DocEntry], T1.[DocDate] AS 'LastActivity'
        FROM RDR1 T0
        INNER JOIN ORDR T1 
            ON T0.[DocEntry]=T1.[DocEntry]
        WHERE T0.[ItemCode] = 'A00001_ test non inventory' 
        OR T0.[ItemCode] = 'A00001'
    ) A
) B
WHERE A.rownum=1;

Совет: Вы можете сделать запросы более читабельными, заменив производные таблицы общими табличными выражениями:

WITH CTEUnion AS
(
        SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T0.[DocEntry], T1.[DocDate] AS 'LastActivity'
        FROM INV1 T0
        INNER JOIN OINV T1 
            ON T0.[DocEntry]=T1.[DocEntry]
        WHERE T0.[ItemCode] = 'A00001_ test non inventory' 
        OR T0.[ItemCode] = 'A00001'

        UNION ALL

        SELECT T0.[ItemCode], T1.[ObjType], T1.[DocNum], T0.[DocEntry], T1.[DocDate] AS 'LastActivity'
        FROM RDR1 T0
        INNER JOIN ORDR T1 
            ON T0.[DocEntry]=T1.[DocEntry]
        WHERE T0.[ItemCode] = 'A00001_ test non inventory' 
        OR T0.[ItemCode] = 'A00001'        
), CTERowNum AS
(
    SELECT ItemCode, ObjType, DocNum, LastActivity,
            ROW_NUMBER() OVER (PARTITION BY ItemCode ORDER BY DocEntry DESC) AS 'rownum'
    FROM CTEUnion
)

SELECT ItemCode, ObjType, DocNum, LastActivity
FROM CTERowNum
WHERE rownum=1;
...