我知道之前曾有人问过这个问题,我看过很多解决方案,但是我无法采用任何解决方案来解决我的问题。 我想返回具有最大日期的每个公司和ComplianceTypeID的行。
此查询显示我的数据。
SELECT [ComplianceItemID]
,[CorporationID]
,[Date]
,[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem]
Where CorporationID = '869'
返回此结果
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
我只想返回每个ComplianceTypeID中日期最高的行
稍后我将参数化查询,而不是固定的CoprorationID。
我希望看到返回了8行,应该排除第1行,因为还有另一个具有较新日期的ComplianceTypeID 1。
我已经尝试过了,但是只返回了5行,所有日期都为'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
似乎还有许多其他方法可以解决此问题。 我只需要一个有效的方法就可以了:)我已经紧张了半天,没有进步。
感谢您的协助 大卫
答案 0 :(得分:2)
通常通过窗口函数来处理。
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
最后,这也可以通过派生表和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]