Sql 如何获取每个事件id的最新记录列表?
我有一个在我们的外联网中填充表单的视图。我们只想看到每组物质数量的最新数据 在下图中,我们不希望在红色的右侧看到任何事件日期,因为它们是旧事件。我们确实想保留左边的数据 我在表中突出显示的行是应该在Extranet表单中显示的行 每一行都是一个不同的物号 这是为提取数据而创建的视图 我不知道如何只显示最新的事件。 任何帮助都将不胜感激Sql 如何获取每个事件id的最新记录列表?,sql,sql-server,Sql,Sql Server,我有一个在我们的外联网中填充表单的视图。我们只想看到每组物质数量的最新数据 在下图中,我们不希望在红色的右侧看到任何事件日期,因为它们是旧事件。我们确实想保留左边的数据 我在表中突出显示的行是应该在Extranet表单中显示的行 每一行都是一个不同的物号 这是为提取数据而创建的视图 我不知道如何只显示最新的事件。 任何帮助都将不胜感激 SELECT e.eventsno AS DocketID, M1.mattercode, M1.clientid, M1.matter
SELECT e.eventsno AS DocketID,
M1.mattercode,
M1.clientid,
M1.matterid,
M1.AreaofLaw,
DocketCode,
e.eventdate AS StartDate,
e.enddate,
et.eventdesc,
Cast(e.notes AS VARCHAR(4096)) AS Summary
FROM dbo.events AS e
INNER JOIN dbo.eventmatters AS em
ON em.events = e.events
INNER JOIN dbo.matters AS m
ON m.matters = em.matters
INNER JOIN dbo.eventtypes AS et
ON et.eventtypes = e.eventtypes
RIGHT OUTER JOIN dbo.vu_lp2_matters AS M1
ON M1.mattercode = m.matterid
WHERE e.eventkind = 'D'
AND e.eventtypes IN (SELECT eventtypes
FROM dbo.events
WHERE ( et.eventdesc <> 'Accounts Receivable'
OR et.eventdesc NOT LIKE 'Reminder%' )
)
AND ( e.eventdate >= CONVERT(DATETIME, '2014-01-01 00:00:00', 102))
您可以使用ROW_NUMBER/RANK为每个组获取第一个值:
WITH cte AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY M1.mattercode ORDER BY e.eventdate DESC) AS rn
-- your complex query
)
SELECT *
FROM cte
WHERE rn = 1;
使用ROW_NUMBER函数进行查询,按事件日期降序排列分区,并筛选ROW_NUMBER=1的记录:
SELECT * from (
SELECT e.eventsno AS DocketID,
M1.mattercode,
M1.clientid,
M1.matterid,
M1.AreaofLaw,
DocketCode,
e.eventdate AS StartDate,
e.enddate,
et.eventdesc,
Cast(e.notes AS VARCHAR(4096)) AS Summary ,
ROW_NUMBER () OVER (PARTITION BY M1.mattercode order by e.eventdate desc) as row_no
FROM dbo.events AS e
INNER JOIN dbo.eventmatters AS em
ON em.events = e.events
INNER JOIN dbo.matters AS m
ON m.matters = em.matters
INNER JOIN dbo.eventtypes AS et
ON et.eventtypes = e.eventtypes
RIGHT OUTER JOIN dbo.vu_lp2_matters AS M1
ON M1.mattercode = m.matterid
WHERE e.eventkind = 'D'
AND e.eventtypes IN (SELECT eventtypes
FROM dbo.events
WHERE ( et.eventdesc <> 'Accounts Receivable'
OR et.eventdesc NOT LIKE 'Reminder%' )
)
AND ( e.eventdate >= CONVERT(DATETIME, '2014-01-01 00:00:00', 102))
) TMP where row_no=1
谢谢你的帮助。最后,我使用CTE来正确显示数据。下面是完整的脚本
With cte As
(Select e.EventsNo,
m1.MatterCode,
m1.ClientID,
m1.MatterID,
m1.AreaOfLaw,
e.EventTypes AS DocketCode,
e.EventDate,
e.EndDate,
et.DocketDesc ,
Cast(e.notes AS VARCHAR(4096)) Summary ,
Row_Number() Over(Partition By MatterCode Order By EventDate Desc) AS rnLastOverAll,
Row_Number() Over(Partition By MatterCode, DocketDesc Order By EventDate Desc) As rnLastByDocDesc
FROM dbo.events e
INNER JOIN dbo.eventmatters em ON em.events = e.events
INNER JOIN dbo.matters m ON m.matters = em.matters
INNER JOIN dbo.vu_LP2_DocketCodes et ON et.DocketCode = e.eventtypes
RIGHT OUTER JOIN dbo.vu_lp2_matters M1 ON M1.mattercode = m.matterid
WHERE e.eventkind = 'D'
)
Select c2.EventsNo 'DocketID',c2.MatterCode,c2.ClientID,c2.MatterID, c2.AreaOfLaw,
c2.DocketCode, c2.EventDate 'StartDate', c2.EndDate, c2.DocketDesc, c2.Summary
From cte c1
Inner Join cte c2 On c1.MatterCode = c2.MatterCode And c2.rnLastByDocDesc = 1
And (
(c1.DocketDesc = 'Demand' And c2.DocketDesc In ('Demand'))
Or (c1.DocketDesc = 'Complaint' And c2.DocketDesc In ('Demand', 'Complaint'))
Or (c1.DocketDesc = 'Pre-Trial' And c2.DocketDesc In ('Demand', 'Complaint', 'Pre-Trial'))
Or (c1.DocketDesc = 'Post Judgment' And c2.DocketDesc In ('Demand', 'Complaint', 'Pre-Trial', 'Post Judgment'))
Or (c1.DocketDesc = 'Stop Collections' And c2.DocketDesc In ('Demand', 'Complaint', 'Pre-Trial', 'Post Judgment', 'Stop Collections'))
) Where c1.rnLastOverAll = 1
下面CTE->子查询的答案基本相同,这个答案有什么不同?感谢您的回复。这只会把最上面的一排带回来。我已编辑了原始问题,以澄清所需内容。根据您的问题,您需要每组事件编号的最新事件。mattercode是一组物质编号吗?我没有正确解释它,这就是我编辑原始帖子的原因。这里是规则。如果最新事件为“需求”,则仅显示“需求”的日期。如果最新事件为“投诉”,则显示“要求”和“投诉”的最新日期。如果最新事件是“预审”,则显示“要求”、“投诉”和“预审”等的最新日期。我希望这会有所帮助。