[英]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.