【问题标题】:TSQL - how to get the MAX of multiple columnsTSQL - 如何获得多列的最大值
【发布时间】:2014-06-21 07:18:42
【问题描述】:

我有一张桌子和

EMPLOYEE_CODE, 
ENTITLEMENT_CODE, 
TRANS_DATE, 
UNIQUE_ID, 
HOURS. 

对于EMPLOYEE_CODEENTITLEMENT_CODE 的每个组合,我需要获取最大 TRANS_DATE 的 HOURS,但可能会出现多次最大 TRANS_DATE,因此我需要进一步细化查询以获得最大值UNIQUE_ID 和因此返回的特定行的 HOURS。我尝试了各种方法,但我可以得到部分查询,但不能将全部内容放在一起。

所以我可能有类似的东西:

EMPLOYEE_CODE,  ENTITLEMENT_CODE,   TRANS_DATE, UNIQUE_ID,  HOURS.
-----------------------------------------------------------------
2305            ANNL                04/15/2014  28547       15.55
2305            ANNL                04/15/2014  28622       16.83
2305            ANNL                04/15/2014  28223       18.62
2305            ANNL                04/08/2014  28111       12.22
2305            SICK                04/12/2014  28150       14.47
2305            SICK                04/12/2014  28162       12.44
2305            SICK                03/11/2014  28062       18.66 

所以这需要返回

16.83 for 2305 ANNL 
12.44 for 2305 SICK

非常感谢任何帮助。

【问题讨论】:

    标签: sql-server tsql max multiple-columns


    【解决方案1】:

    试试这个:

    ;WITH CTE
    AS
    (
        SELECT
          *,
          ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_CODE, ENTITLEMENT_CODE
                             ORDER BY TRANS_DATE DESC, UNIQUE_ID DESC) rn
        FROM tbl
    )
    SELECT 
      EMPLOYEE_CODE, 
      ENTITLEMENT_CODE, 
      HOURS
    FROM CTE
    WHERE rn = 1
    

    SQL FIFFLE DEMO

    【讨论】:

    • 这很好用哈姆雷特。我以前没有使用过 CTE,所以我会进一步研究它以提高我的理解,但查询返回了我的预期。感谢您的帮助。
    【解决方案2】:

    尝试使用row_number()partition by clause

    select * from
    (
    select *,rn=row_number()over(partition by ENTITLEMENT_CODE order by UNIQUE_ID desc)
    from table
    )x
    where x.rn=1
    

    【讨论】:

      【解决方案3】:

      如果您更喜欢使用关联子查询:

      SELECT HOURS, EMPLOYEE_CODE, ENTITLEMENT_CODE
      FROM mytable T1
      WHERE NOT EXISTS
      (
          SELECT *
          FROM mytable T2
          WHERE  T2.EMPLOYEE_CODE    = T1.EMPLOYEE_CODE
            AND  T2.ENTITLEMENT_CODE = T1.ENTITLEMENT_CODE
            AND (T2.TRANS_DATE > T1.TRANS_DATE
              OR T2.TRANS_DATE = T1.TRANS_DATE AND T2.UNIQUE_ID > T1.UNIQUE_ID)
      )
      

      您最好有一个超过EMPLOYEE_CODEENTITLEMENT_CODE(复合)的索引,这样才能有效地工作。

      【讨论】:

        【解决方案4】:

        可能是这样的

         Select T.* From Table1 T JOIN
           ( Select Max(S.UNIQUE_ID) MaxUniq,S.EMPLOYEE_CODE,S.ENTITLEMENT_CODE
             From Table1 S Join
                ( Select T1.EMPLOYEE_CODE,T1.ENTITLEMENT_CODE,Max(T1.TRANS_DATE) As MaxDate
                  From Table1 T1 Group By T1.EMPLOYEE_CODE,T1.ENTITLEMENT_CODE
                ) JR On S.TRANS_DATE = JR.MaxDate AND S.EMPLOYEE_CODE = JR.EMPLOYEE_CODE AND S.ENTITLEMENT_CODE = JR.ENTITLEMENT_CODE
                 Group By S.EMPLOYEE_CODE,S.ENTITLEMENT_CODE
         )R ON T.UNIQUE_ID = R.MaxUniq 
        

        Fiddle Demo

        输出将是:


        EMPLOYEE_CODE   ENTITLEMENT_CODE    TRANS_DATE  UNIQUE_ID   HOURS
        2305            ANNL                2014-04-15  28622       16.83
        2305            SICK                2014-04-12  28162       12.44
        

        【讨论】:

        • 这很好用 Vignesh 并返回了我的预期。我不确定这是否比发布的 CTE 解决方案有优势。感谢您的帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多