【问题标题】:Get latest item activity as one line per item以每个项目一行的形式获取最新项目活动
【发布时间】:2019-07-28 07:06:45
【问题描述】:

专家, 我有一个查询向我显示 Order 和 Invoice 表的最新 Item 活动。我需要进一步缩小范围,每个项目只显示一个结果 - 最新活动,无论是订单还是发票......

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;

【问题讨论】:

  • Top 1 ... 不起作用吗?
  • 在第一个 SELECT 中添加 Top 1 时,它只带回一个项目记录。当我将它添加到 2 个嵌入式 SELECTS 时,它为 SO 和 Invoice 带回了相同的项目。
  • 如果您可以添加一些示例数据或使用此查询获得的输出,它可能会更清楚。

标签: sql tsql greatest-n-per-group


【解决方案1】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2017-04-11
    • 2019-10-11
    • 1970-01-01
    • 2023-03-05
    • 2011-02-15
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多