【问题标题】:New to SQL Server Sub Queries - Hopefully an easy oneSQL Server 子查询的新手 - 希望是一个简单的
【发布时间】:2023-03-12 17:54:01
【问题描述】:

我无法在单个查询中解决这个问题。 表TblQcProduction 有一条生产订单上每个操作员的记录。

我需要找出最后一个报告生产订单的操作员是谁。

SELECT  IDX, ProdOrder, Operator
FROM dbo.TblQCProduction

返回:

IDX     ProdOrder  Operator
8050745 325184     13012
8050746 325184     13035
8050747 325184     13036
8050748 325186     13005
8050749 325186     13038
8050750 325187     13022
8050751 325191     13022
8050752 325191     13035

我需要输出为(通过 prodOrder 返回 MAX IDX 的运算符):

IDX     ProdOrder Operator
8050747 325184    13036
8050749 325186    13038
8050750 325187    13022
8050752 325191    13035

我不喜欢分组或子查询——我觉得会有一个非常简单的答案。

【问题讨论】:

    标签: sql sql-server in-subquery


    【解决方案1】:

    你需要使用ROW_NUMBER() OVER

    select IDX,ProdOrder,Operator 
    
    from 
    (
    select IDX,ProdOrder,Operator,
           ROW_NUMBER() OVER 
             (PARTITION BY ProdOrder ORDER BY IDX DESC) as rn
    from TblQCProduction
    ) as T
    WHERE RN=1;
    

    SQLFiddle demo

    【讨论】:

      【解决方案2】:

      试试这个 -

      DECLARE @temp TABLE
      (
          IDX INT, ProdOrder INT, Operator INT
      )
      
      INSERT INTO @temp (IDX, ProdOrder, Operator)
      VALUES 
          (8050745, 325184, 13012),
          (8050746, 325184, 13035),
          (8050747, 325184, 13036),
          (8050748, 325186, 13005),
          (8050749, 325186, 13038),
          (8050750, 325187, 13022),
          (8050751, 325191, 13022),
          (8050752, 325191, 13035)
      
      SELECT t.IDX, t.ProdOrder, t.Operator
      FROM ( 
          SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY ProdOrder ORDER BY IDX DESC) 
          FROM @temp
      ) t
      WHERE t.rn = 1
      

      输出 -

      IDX         ProdOrder   Operator
      ----------- ----------- -----------
      8050747     325184      13036
      8050749     325186      13038
      8050750     325187      13022
      8050752     325191      13035
      

      【讨论】:

      • +1 我使用了 Pieter 的解决方案这里的 luddites 在 SQL2000 上
      【解决方案3】:
      ;WITH MyCTE AS
      (
          SELECT IDX,
                 ProdOrder,
                 Operator
                 ROW_NUMBER() OVER (PARTITION BY ProdOrder ORDER BY IDX DESC) AS RowNum
          FROM   TblQCProduction
      )
      
      SELECT IDX,
             ProdOrder,
             Operator 
      FROM MyCTE 
      WHERE RowNum = 1
      

      【讨论】:

        【解决方案4】:

        我喜欢加入:

        SELECT midx, t.prodorder, tt.operator 
        FROM  (
          SELECT MAX(idx) AS midx, prodorder
          FROM dbo.TblQCProduction GROUP BY prodorder
        ) t LEFT JOIN dbo.TblQCProduction tt ON t.midx=tt.idx
        

        【讨论】:

        • Pieter - 你知道了,效果很好。这里的 luddites 在 SQL2000 上
        • 正如我所说的我喜欢连接,在支持它的 SQL Server 版本中,我认为“partition by”语法成本更低。
        猜你喜欢
        • 1970-01-01
        • 2012-02-28
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2018-05-27
        • 1970-01-01
        相关资源
        最近更新 更多