1

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

这是我的查询:

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

有人可以建议我怎么做吗?或者我可以阅读如何做到这一点的地方?

4

5 回答 5

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
于 2013-05-09T09:55:22.963 回答
1

假设 Client 是您的 PK,您可以采用这样的方法

Select * from TonerRequest 
where Status = 'Open' 
and date in (select max(date) from TonerRequest group by Client)
于 2013-05-09T09:58:21.840 回答
1

我会使用自联接(同一张表的内部联接)来解决这个问题。

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 Fiddle 上整理了一个示例:http ://sqlfiddle.com/#!6/ba532/6

有关自联接的更多信息,请参见此处:http: //blog.sqlauthority.com/2010/07/08/sql-server-the-self-join-inner-join-and-outer-join/

于 2013-05-10T18:21:27.950 回答
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
于 2013-05-09T09:59:13.027 回答
0

尝试这个:

SELECT TOP 1 Client, Model, SerialNo, Dep, Level, Colour, Status FROM TonerRequest WHERE Status = 'Open' ORDER BY Date DESC
于 2013-05-09T09:55:12.163 回答