Select 具有最大日期和其他条件的行
Select the row with the maximum date and other criteria
我知道这个问题以前有人问过,我也看过很多解决方案,但我无法调整任何解决方案来解决我的问题。
我想 return 每个公司的行和具有最大日期的 complianceTypeID。
这个查询显示了我的数据。
SELECT [ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem]
Where CorporationID = '869'
Returns这个结果
ComplianceItemID CorporationID Date ComplianceTypeID
55761 869 2018-06-20 1
56840 869 2022-11-07 2
57919 869 1900-01-01 3
58998 869 1900-01-01 4
60077 869 1900-01-01 5
61156 869 1900-01-01 6
62235 869 1900-01-01 7
63316 869 2018-06-25 8
63322 869 2018-06-26 1
我只想 return 每个 ComplianceTypeID
中具有最高日期的行
稍后我将参数化查询而不是固定的 CoprorationID。
我希望看到 8 行 returned,应该排除第 1 行,因为还有另一个 ComplianceTypeID 1 的日期较新。
我试过了,但只有 5 行 returned 的日期都是“1900-01-01”
SELECT
VC1.ComplianceItemID,
VC1.CorporationID,
VC1.[Date],
VC1.ComplianceTypeID
FROM ViewComplianceItem VC1
Left Join ViewComplianceItem VC2
On VC1.ComplianceTypeID = VC2.ComplianceTypeID
AND VC1.[Date] > VC2.[Date]
Where VC2.[Date] is null
AND VC1.CorporationID = '869'
结果
ComplianceItemID CorporationID Date ComplianceTypeID
57919 869 1900-01-01 3
58998 869 1900-01-01 4
60077 869 1900-01-01 5
61156 869 1900-01-01 6
62235 869 1900-01-01 7
似乎有许多其他方法可以解决这个问题。
我只需要一个有效的 :) 我已经绞尽脑汁半天了,但没有任何进展。
感谢您的帮助
大卫
这通常由 window 函数处理。
create procedure my proc (@corpID int)
as
begin
;WITH CTE AS(
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
,RN = row_number() over (partition by ComplianceTypeID order by [Date] desc)
FROM [Compliance].[dbo].[ViewComplianceItem]
WHERE CorporationID = @corpID)
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM CTE
WHERE RN = 1
end
您也可以不进行参数化,或忽略 WHERE
子句,并将其添加到 PARTITION BY
以恢复您对每个公司的逻辑。
WITH CTE AS(
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
,RN = row_number() over (partition by CorporationID, ComplianceTypeID order by [Date] desc)
FROM [Compliance].[dbo].[ViewComplianceItem])
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM CTE
WHERE RN = 1
最后,这也可以用派生的 table 和 MAX
聚合来处理:
SELECT
t1.[ComplianceItemID]
,t1.[CorporationID]
,t1.[Date]
,t1.[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem] t1
INNER JOIN (SELECT CorporationID, ComplianceItemID, MAX([Date]) dt
FROM [Compliance].[dbo].[ViewComplianceItem]
GROUP BY CorporationID, ComplianceItemID) t2 on
t2.CorporationID = t1.CorporationID
and t2.ComplianceItemID = t1.ComplianceItemID
and t2.dt = t1.[Date]
我知道这个问题以前有人问过,我也看过很多解决方案,但我无法调整任何解决方案来解决我的问题。 我想 return 每个公司的行和具有最大日期的 complianceTypeID。
这个查询显示了我的数据。
SELECT [ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem]
Where CorporationID = '869'
Returns这个结果
ComplianceItemID CorporationID Date ComplianceTypeID
55761 869 2018-06-20 1
56840 869 2022-11-07 2
57919 869 1900-01-01 3
58998 869 1900-01-01 4
60077 869 1900-01-01 5
61156 869 1900-01-01 6
62235 869 1900-01-01 7
63316 869 2018-06-25 8
63322 869 2018-06-26 1
我只想 return 每个 ComplianceTypeID
中具有最高日期的行稍后我将参数化查询而不是固定的 CoprorationID。
我希望看到 8 行 returned,应该排除第 1 行,因为还有另一个 ComplianceTypeID 1 的日期较新。
我试过了,但只有 5 行 returned 的日期都是“1900-01-01”
SELECT
VC1.ComplianceItemID,
VC1.CorporationID,
VC1.[Date],
VC1.ComplianceTypeID
FROM ViewComplianceItem VC1
Left Join ViewComplianceItem VC2
On VC1.ComplianceTypeID = VC2.ComplianceTypeID
AND VC1.[Date] > VC2.[Date]
Where VC2.[Date] is null
AND VC1.CorporationID = '869'
结果
ComplianceItemID CorporationID Date ComplianceTypeID
57919 869 1900-01-01 3
58998 869 1900-01-01 4
60077 869 1900-01-01 5
61156 869 1900-01-01 6
62235 869 1900-01-01 7
似乎有许多其他方法可以解决这个问题。 我只需要一个有效的 :) 我已经绞尽脑汁半天了,但没有任何进展。
感谢您的帮助 大卫
这通常由 window 函数处理。
create procedure my proc (@corpID int)
as
begin
;WITH CTE AS(
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
,RN = row_number() over (partition by ComplianceTypeID order by [Date] desc)
FROM [Compliance].[dbo].[ViewComplianceItem]
WHERE CorporationID = @corpID)
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM CTE
WHERE RN = 1
end
您也可以不进行参数化,或忽略 WHERE
子句,并将其添加到 PARTITION BY
以恢复您对每个公司的逻辑。
WITH CTE AS(
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
,RN = row_number() over (partition by CorporationID, ComplianceTypeID order by [Date] desc)
FROM [Compliance].[dbo].[ViewComplianceItem])
SELECT
[ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM CTE
WHERE RN = 1
最后,这也可以用派生的 table 和 MAX
聚合来处理:
SELECT
t1.[ComplianceItemID]
,t1.[CorporationID]
,t1.[Date]
,t1.[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem] t1
INNER JOIN (SELECT CorporationID, ComplianceItemID, MAX([Date]) dt
FROM [Compliance].[dbo].[ViewComplianceItem]
GROUP BY CorporationID, ComplianceItemID) t2 on
t2.CorporationID = t1.CorporationID
and t2.ComplianceItemID = t1.ComplianceItemID
and t2.dt = t1.[Date]