繁体   English   中英

在SQL中使用其他列获取Max?

[英]Get Max with other columns in SQL?

如何使用以下查询中的其他列获取Max(OD.CYCLE_END_DATE)

    SELECT   C.MASTER_CUSTOMER_ID
            ,C.USR_SPE_Membership_Status
            ,OD.PRODUCT_CODE
            ,OD.CYCLE_BEGIN_DATE
            ,OD.CYCLE_END_DATE
            ,LINE_STATUS_CODE
FROM CUSTOMER C
LEFT OUTER JOIN ORDER_DETAIL OD
      ON C.MASTER_CUSTOMER_ID = OD.SHIP_MASTER_CUSTOMER_ID
      AND C.SUB_CUSTOMER_ID = OD.SHIP_SUB_CUSTOMER_ID
      AND OD.PRODUCT_CODE in ('PROFESSIONAL','LIFE','STUDENT','STAFF')
     --AND OD.CYCLE_BEGIN_DATE <= GETDATE()
     AND OD.CYCLE_END_DATE >= GETDATE()

where C.MASTER_CUSTOMER_ID= '3420065'

结果

MASTER_CUSTOMER_ID  USR_SPE_Membership_Status   PRODUCT_CODE    CYCLE_BEGIN_DATE    CYCLE_END_DATE  LINE_STATUS_CODE
3420065             Paid Member                 LIFE            2013-01-01          2013-12-31          A
3420065             Paid Member                 LIFE            2014-01-01          2014-12-31          A

我需要2014-12-31排。

你有选择,

你可以采取MAX()GROUP BY ,你不想拿域MAX()的,

或者你可以使用ROW_NUMBER()函数:

WITH    cte
      AS ( SELECT   C.MASTER_CUSTOMER_ID ,
                    C.USR_SPE_Membership_Status ,
                    OD.PRODUCT_CODE ,
                    OD.CYCLE_BEGIN_DATE ,
                    OD.CYCLE_END_DATE ,
                    LINE_STATUS_CODE ,
                    ROW_NUMBER() OVER ( PARTITION BY C.MASTER_CUSTOMER_ID ORDER BY OD.CYCLE_END_DATE DESC ) RN
           FROM     CUSTOMER C
                    LEFT OUTER JOIN ORDER_DETAIL OD ON C.MASTER_CUSTOMER_ID = OD.SHIP_MASTER_CUSTOMER_ID
                                                       AND C.SUB_CUSTOMER_ID = OD.SHIP_SUB_CUSTOMER_ID
                                                       AND OD.PRODUCT_CODE IN (
                                                       'PROFESSIONAL',
                                                       'LIFE', 'STUDENT',
                                                       'STAFF' )
                     --AND OD.CYCLE_BEGIN_DATE <= GETDATE()
                                                       AND OD.CYCLE_END_DATE >= GETDATE()
           WHERE    C.MASTER_CUSTOMER_ID = '3420065'
         )
SELECT  *
FROM    cte
WHERE   RN = 1

ROW_NUMBER()函数为每一行分配一个数字。

PARTITION BY是可选的,但用于为该组中的每个值开始编号,

即:如果您对PARTITION BY MASTER_CUSTOMER_ID进行PARTITION BY MASTER_CUSTOMER_ID那么对于每个唯一的客户ID值,编号将从1开始。

ORDER BY当然用于定义计数应该如何进行,

并且在ROW_NUMBER()函数中是必需的。

为了在使用MAX()时从其他列返回数据,必须将它们包含在其他聚合函数或GROUP BY子句中,这些子句将在WHERE caluse之后添加

SELECT *
FROM
(
    SELECT   C.MASTER_CUSTOMER_ID
            ,C.USR_SPE_Membership_Status
            ,OD.PRODUCT_CODE
            ,OD.CYCLE_BEGIN_DATE
            ,OD.CYCLE_END_DATE
            ,LINE_STATUS_CODE,
             ROW_NUMBER() OVER (PARTITION BY C.MASTER_CUSTOMER_ID ORDER BY CYCLE_BEGIN_DATE DESC) AS [number]
FROM CUSTOMER C
LEFT OUTER JOIN ORDER_DETAIL OD
      ON C.MASTER_CUSTOMER_ID = OD.SHIP_MASTER_CUSTOMER_ID
      AND C.SUB_CUSTOMER_ID = OD.SHIP_SUB_CUSTOMER_ID
      AND OD.PRODUCT_CODE in ('PROFESSIONAL','LIFE','STUDENT','STAFF')
     --AND OD.CYCLE_BEGIN_DATE <= GETDATE()
     AND OD.CYCLE_END_DATE >= GETDATE()

where C.MASTER_CUSTOMER_ID= '3420065'
) A 
WHERE A.[number] = 1

您可以在SELECT中返回一个值的子查询:

SELECT   C.MASTER_CUSTOMER_ID
        ,C.USR_SPE_Membership_Status
        ,OD.PRODUCT_CODE
        ,OD.CYCLE_BEGIN_DATE
        ,OD.CYCLE_END_DATE
        ,LINE_STATUS_CODE
        ,(SELECT MAX(CYCLE_END_DATE) 
             FROM ORDER_DETAIL 
             WHERE PRODUCT_CODE in ('PROFESSIONAL','LIFE','STUDENT','STAFF')
                 AND CYCLE_END_DATE >= GETDATE()
                 AND C.MASTER_CUSTOMER_ID = SHIP_MASTER_CUSTOMER_ID
                 AND C.SUB_CUSTOMER_ID = SHIP_SUB_CUSTOMER_ID
            ) MAX_CYCLE_END_DATE
FROM ...             

你可以使用Cross Apply:

SELECT   C.MASTER_CUSTOMER_ID
            ,C.USR_SPE_Membership_Status
            ,CrossApplyTable.PRODUCT_CODE
            ,CrossApplyTable.CYCLE_BEGIN_DATE
            ,CrossApplyTable.CYCLE_END_DATE
            ,LINE_STATUS_CODE
FROM CUSTOMER C
CROSS APPLY(SELECT TOP 1 * 
            FROM ORDER_DETAIL OD
            WHERE C.MASTER_CUSTOMER_ID = OD.SHIP_MASTER_CUSTOMER_ID
            AND C.SUB_CUSTOMER_ID = OD.SHIP_SUB_CUSTOMER_ID
            AND OD.PRODUCT_CODE in ('PROFESSIONAL','LIFE','STUDENT','STAFF')
     --     AND OD.CYCLE_BEGIN_DATE <= GETDATE()
            AND OD.CYCLE_END_DATE >= GETDATE() 
            ORDER BY CYCLE_END_DATE DESC) CrossApplyTable

where C.MASTER_CUSTOMER_ID = '3420065'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM