Sql 如何获取每个事件id的最新记录列表?

Sql 如何获取每个事件id的最新记录列表?,sql,sql-server,Sql,Sql Server,我有一个在我们的外联网中填充表单的视图。我们只想看到每组物质数量的最新数据 在下图中,我们不希望在红色的右侧看到任何事件日期,因为它们是旧事件。我们确实想保留左边的数据 我在表中突出显示的行是应该在Extranet表单中显示的行 每一行都是一个不同的物号 这是为提取数据而创建的视图 我不知道如何只显示最新的事件。 任何帮助都将不胜感激 SELECT e.eventsno AS DocketID, M1.mattercode, M1.clientid, M1.matter

我有一个在我们的外联网中填充表单的视图。我们只想看到每组物质数量的最新数据

在下图中,我们不希望在红色的右侧看到任何事件日期,因为它们是旧事件。我们确实想保留左边的数据

我在表中突出显示的行是应该在Extranet表单中显示的行

每一行都是一个不同的物号

这是为提取数据而创建的视图

我不知道如何只显示最新的事件。 任何帮助都将不胜感激

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是一组物质编号吗?我没有正确解释它,这就是我编辑原始帖子的原因。这里是规则。如果最新事件为“需求”,则仅显示“需求”的日期。如果最新事件为“投诉”,则显示“要求”和“投诉”的最新日期。如果最新事件是“预审”,则显示“要求”、“投诉”和“预审”等的最新日期。我希望这会有所帮助。