2013-05-09 53 views
1

我很努力構建一個查詢,其中只顯示客戶端的一條記錄,但顯示的記錄必須是添加到客戶端數據庫的最後一條記錄......我可以使用MAX(日期)以獲取最新日期。原因是我正在構建一個Gridview,其中每個客戶端的一個記錄將被列出(最後添加的記錄),然後他們可以選擇查看歷史記錄。同一個客戶端的任何第二行應該被看作....選擇每個客戶端的最大日期

這是我的查詢:

SELECT Client, Model, SerialNo, Dep, Level, Colour, Status 
FROM TonerRequest 
WHERE Status = 'Open' 

有人可以請建議我該怎麼辦呢?或者在哪裏我可以閱讀如何做到這一點?

回答

3

您可以使用row_number()挑選每個客戶機的最新行:

SELECT * 
FROM (
     SELECT ROW_NUMBER() OVER (
        PARTITION BY Client 
        ORDER BY Date DESC) as rn 
     ,  Client 
     ,  Model 
     ,  SerialNo 
     ,  ... 
     FROM TonerRequest 
     WHERE Status = 'Open' 
     ) SubQueryALias 
WHERE rn = 1 
+0

爲什麼這會得到一個downvote?它做什麼需要 – Ric 2013-05-09 09:58:36

+0

它帶來了正確的行和數據,但它給出了一個不應該顯示的ekstra列..... – Kerieks 2013-05-09 10:41:53

+0

你可以用你所需要的列的列表替換'select *' – Andomar 2013-05-09 10:45:12

0

試試這個:

SELECT TOP 1 Client, Model, SerialNo, Dep, Level, Colour, Status FROM TonerRequest WHERE Status = 'Open' ORDER BY Date DESC 
+1

作爲OP問 – Andomar 2013-05-09 09:56:01

+1

不會工作,這將只顯示一個記錄,每個客戶端不是隻有一條記錄。因爲您只是在不考慮客戶端的情況下檢索最新版本。 – Yahya 2013-05-09 09:56:17

+0

OP說「每個客戶的記錄在哪裏」 – Yahya 2013-05-09 10:00:43

1

假設客戶是你PK,你可以這樣

的方法
Select * from TonerRequest 
where Status = 'Open' 
and date in (select max(date) from TonerRequest group by Client) 
+1

+1即使客戶不是PK,這也可以工作。它不會打破關係(一個客戶與兩個具有相同日期的行)。 – Andomar 2013-05-09 10:00:10

+0

是的,你是對的。但在我看來,在'PK'中使用'group by'更好。它可以幫助你避免不必要的錯誤 – 2013-05-09 10:02:37

+0

這仍然帶回所有的行.... – Kerieks 2013-05-09 10:41:08

1

類似這樣的:

SELECT * FROM TonerRequest TR, 
(Max(YourDateColumn) MaxDate, Client 
FROM TonerRequest 
WHERE Status = 'Open' 
GROUP BY Client) TRSub 
WHERE TR.Client == TRSub.Client 
AND TR.YourDateColum == TRSub.MaxDate 
+0

打敗了我,它有幾乎相同的查詢;) – nakchak 2013-05-09 10:02:05

1

我會使用自聯接(INNER JOIN到同一張表)來解決這個問題。

SELECT DISTINCT 
    a.Client 
    ,a.Model 
    ,a.SerialNo 
    ,a.Dep 
    ,a.Level 
    ,a.Colour 
    ,a.Status 
    FROM TonerRequest AS a 
    INNER JOIN 
    (SELECT 
     MAX([Date]) OVER (PARTITION BY Client) AS 'Date' 
     ,Client 
     ,Status 
     FROM TonerRequest 
     WHERE Status = 'Open' 
    ) AS b 
    ON a.Client = b.Client 
    AND a.[Date] = b.[Date] 
    AND a.Status = b.Status 
; 

a是SELECT子句的作用,而b將限制從FROM子句給予SELECT的結果。

我把一個樣品上的SQL小提琴:http://sqlfiddle.com/#!6/ba532/6

在這裏看到更多自聯接:http://blog.sqlauthority.com/2010/07/08/sql-server-the-self-join-inner-join-and-outer-join/