2015-10-23 39 views
0

我需要提取特定事件發生的最新日期。在數據庫中,我有一個測試,每個用戶完成多次。我只希望當用戶的最後一次測試結果低於200時。SQL最新日期和事件

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以下測試的人員拉出來,但由於某種原因,不是在最後一次約會時。

+0

不能想象你在問什麼。請用示例數據和期望的結果來說明。 –

回答

0

如果我您的要求理解正確,那就是:

給我最近的記錄,其中用戶得分低於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 

返回:

UserId TestDate Result 
1  2015-08-23 190 
2  2015-10-23 190 
3  2015-10-23 170 
0

假設你想要只有的用戶在最後日期被評爲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 

使用我把作爲例子中的數據,你會得到這樣的:

UsrID Date rate 
2 2015-08-03 190 
3 2015-08-07 150 
4 2015-08-09 140 
+0

這看起來像它會工作。謝謝! – JFulton

+0

@JFulton:太棒了!所以如果您認爲它可以幫助您通過點擊我答案右側的正確符號來正確選擇我的答案。 –