2013-05-09 52 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/