选择每个客户的最大日期

时间:2013-05-09 09:53:04

标签: c# sql vb.net

我正在努力构建一个查询,其中只显示一个客户端的记录,但显示的记录必须是添加到该客户端数据库的最后一条记录...我可以使用MAX(日期)得到最新的约会。原因是我正在构建一个Gridview,其中将列出每个客户端的一条记录(最后添加的记录),然后他们可以选择查看历史记录。不应该看到同一客户的第二行......

这是我的疑问:

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

有人可以建议我怎么做吗?或者在哪里我可以读到如何做到这一点?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

假设客户端是您的PK,您可以采用这样的方法

Select * from TonerRequest 
where Status = 'Open' 
and date in (select max(date) from TonerRequest group by Client)

答案 2 :(得分: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

答案 3 :(得分: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/

答案 4 :(得分:0)

试试这个:

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