2012-08-10 140 views
1

我有一條SQL語句。使用SQL選擇最近日期的行

SELECT 
    ID, LOCATION, CODE,MAX(DATE),FLAG 
FROM 
    TABLE1 
WHERE 
    DATE <= CONVERT(DATETIME,'11-11-2012') 
    AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE) 
    AND ID IN (14, 279) 
GROUP BY 
    ID, LOCATION, CODE 

我需要具有與11-11-2012最近日期的行,但該表返回所有值。我究竟做錯了什麼。謝謝

ID  LOCATION    CODE   DATE    FLAG 
------------------------------------------------------------------- 
14 CAR STREET,UDUPI   234  2012-08-08 00:00:00.000 0 
14 CAR STREET,UDUPI   234  2012-08-10 00:00:00.000 1 
14 CAR STREET,UDUPI   234  2012-08-14 00:00:00.000 0 
279 MADHUGIRI    234  2012-08-08 00:00:00.000 1 
279 MADHUGIRI    234  2012-08-11 00:00:00.000 0 

我想只顯示日期小於或等於給定日期的行。所需的結果是

ID  LOCATION    CODE   DATE    FLAG 
------------------------------------------------------------------- 
14 CAR STREET,UDUPI   234  2012-08-10 00:00:00.000 1 
279 MADHUGIRI    234  2012-08-11 00:00:00.000 0 
+0

作爲開始,你爲什麼用''11 -11-2012''作爲你的日期格式?嘗試「20121111」。爲什麼是第一行8月10日而不是8月14日? – 2012-08-10 11:56:51

+0

@ Aaron Bertrand我將此作爲用戶輸入。我甚至嘗試使用20121111格式,但沒有運氣返回所有五列 – Prince 2012-08-10 12:02:28

+0

您知道您可以控制用戶輸入權限,而不是僅僅傳遞用戶輸入到SQL Server的任何舊字符串?爲什麼不傳遞正確類型的日期或日期時間參數? – 2012-08-10 12:03:18

回答

2

使用子查詢以獲得每個ID最大的日期,然後加入,爲你的餐桌:

SELECT 
    ID, LOCATION, CODE, DATE, FLAG 
FROM 
    TABLE1 
JOIN (
    SELECT ID AS SubID, MAX(DATE) AS SubDATE 
    FROM TABLE1 
    WHERE DATE < '11/11/2012' 
     AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE) 
     AND ID IN (14, 279) 
    GROUP BY ID 
    ) AS SUB ON ID = SubID AND DATE = SubDATE 
+0

謝謝吉姆,那工作 – Prince 2012-08-13 06:38:35

3
;WITH x AS 
(
    SELECT ID, Location, Code, Date, Flag, 
    rn = ROW_NUMBER() OVER 
    (PARTITION BY ID, Location, Code ORDER BY [Date] DESC) 
    FROM dbo.TABLE1 AS t1 
    WHERE [Date] <= '20121111' 
    AND ID IN (14, 279) -- sorry, missed this 
    AND EXISTS (SELECT 1 FROM #TEMP_CODE WHERE CODE = t1.CODE) 
) 
SELECT ID, Location, Code, Date, Flag 
FROM x WHERE rn = 1; 

這產生了:

ID LOCATION   CODE [Date]  FLAG 
--- ---------------- ---- ---------- ---- 
14 CAR STREET,UDUPI 234 2012-08-14 0 
279 MADHUGIRI  234 2012-08-11 0 

這不同意你的要求的結果,但我認爲這些都是錯誤的,我認爲你應該檢查他們。

+0

所需結果應該是小於20121111的行和距離20121111最近的行 – Prince 2012-08-10 12:32:09

+0

@Prince並且不是20120814比20120810更接近2012111?或者你可以用不同的方式解釋爲什麼你想要20120810而不是20120814的那一排?我只能以很多方式提出這個問題 - 現在是3到4次。請說明更好。 – 2012-08-10 12:32:57

-2

添加按日期LIMIT 0,2

與您的訂單將在哪裏以及與限制將只返回頂部2個值由最接近你的病情的日期順序!

SET ROWCOUNT 2 
SELECT 
    ID, LOCATION, CODE,MAX(DATE),FLAG 
FROM 
    TABLE1 
WHERE 
    DATE <= CONVERT(DATETIME,'11-11-2012') 
    AND EXISTS (SELECT * FROM #TEMP_CODE WHERE TABLE1.CODE = #TEMP_CODE.CODE) 
    AND ID IN (14, 279) 
GROUP BY 
    ID, LOCATION, CODE 
ORDER BY DATE 
+0

這正是我在想 – AdRock 2012-08-10 12:08:06

+1

'LIMIT'不存在於SQL Server(也不是任何ANSI/ISO SQL標準) – 2012-08-10 12:16:46

+0

我沒有看到它是SQL服務器,所以這種方式只改變了SET ROWCOUNT 2的限制。硬編碼的ID是他的SQL查詢看起來。我剛剛添加了順序。 – 2012-08-10 12:42:47