我有一个视图,在我们的外联网中填充表单。我们只想查看每组物质编号的最新数据。
在下面的图片中,我们不希望看到任何事件发生在RED的位置,因为它们是旧事件。我们确实希望保留左侧的数据。
我在表格中突出显示的行是应该在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))
答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用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;
答案 2 :(得分:0)
对查询使用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