SQL最新日期和事件
我需要提取特定事件发生的最新日期。在DB中,我有一个由每个用户多次完成的测试。我只想当用户的上一次测试结果低于200SQL最新日期和事件,sql,sql-server,tsql,reporting-services,ssrs-2008,Sql,Sql Server,Tsql,Reporting Services,Ssrs 2008,我需要提取特定事件发生的最新日期。在DB中,我有一个由每个用户多次完成的测试。我只想当用户的上一次测试结果低于200 create table #temp_VL (cln_urn varchar(50), tst_date datetime, tst_df_test_name varchar (50), VL DECIMAL (10,2), cln_pk varchar(100)) 是我要将数据导入的表。我遇到的问题是,有些人在某个时候测试低于200,但后来又回到200以上。我可以把所有考过
create table #temp_VL (cln_urn varchar(50), tst_date datetime, tst_df_test_name varchar (50), VL DECIMAL (10,2), cln_pk varchar(100))
是我要将数据导入的表。我遇到的问题是,有些人在某个时候测试低于200,但后来又回到200以上。我可以把所有考过200分以下的人都拉出来,但由于某种原因,最后一次考试的日期是什么时候 如果我正确理解了您的要求,那就是: 请给出每个用户得分低于200分的最新记录 以下代码显示了实现此目的的示例:
DECLARE @tabTestResults TABLE
(
UserId INT,
TestDate DATE,
Result INT
)
INSERT
INTO @tabTestResults
(
UserId,
TestDate,
Result
)
VALUES ( 1, '2015-01-01', 180 ),
( 1, '2015-07-23', 200 ),
( 1, '2015-08-23', 190 ),
( 1, '2015-09-23', 210 ),
( 2, '2015-01-01', 210 ),
( 2, '2015-10-23', 190 ),
( 3, '2015-10-23', 170 ),
( 4, '2015-10-23', 220 )
SELECT UserId, TestDate, Result
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY TestDate DESC) AS RowNumber, *
FROM @tabTestResults
WHERE Result < 200
) SQ
WHERE RowNumber = 1
假设您只想要在您表示的最后一个日期中评分低于200的用户 我只想当用户的上一次测试结果低于200 您可以使用下面的查询
with CTE as
(
select 1 UsrID, '2015-08-01' [Date], 190 rate
union
select 1 UsrID, '2015-08-02' [Date], 290 rate
union
select 2 UsrID, '2015-08-03' [Date], 190 rate
union
select 3 UsrID, '2015-08-04' [Date], 390 rate
union
select 3 UsrID, '2015-08-07' [Date], 150 rate
union
select 4 UsrID, '2015-08-09' [Date], 140 rate
)
select CTE.UsrID,CTE.Date,CTE.rate
from CTE
inner join
(
select UsrID,max(Date) maxdate
from CTE
group by UsrID
) dt
on CTE.UsrID = dt.UsrID and CTE.Date = dt.maxdate
where rate < 200
无法想象你在问什么。请用示例数据和期望的结果进行说明。@JFulton:很好!因此,如果您认为它可以帮助您通过单击我答案右侧的正确符号来选择正确的答案。
with CTE as
(
select 1 UsrID, '2015-08-01' [Date], 190 rate
union
select 1 UsrID, '2015-08-02' [Date], 290 rate
union
select 2 UsrID, '2015-08-03' [Date], 190 rate
union
select 3 UsrID, '2015-08-04' [Date], 390 rate
union
select 3 UsrID, '2015-08-07' [Date], 150 rate
union
select 4 UsrID, '2015-08-09' [Date], 140 rate
)
select CTE.UsrID,CTE.Date,CTE.rate
from CTE
inner join
(
select UsrID,max(Date) maxdate
from CTE
group by UsrID
) dt
on CTE.UsrID = dt.UsrID and CTE.Date = dt.maxdate
where rate < 200
UsrID Date rate
2 2015-08-03 190
3 2015-08-07 150
4 2015-08-09 140