我正在努力构建一个查询,其中只显示一个客户端的记录,但显示的记录必须是添加到该客户端数据库的最后一条记录...我可以使用MAX(日期)得到最新的约会。原因是我正在构建一个Gridview,其中将列出每个客户端的一条记录(最后添加的记录),然后他们可以选择查看历史记录。不应该看到同一客户的第二行......
这是我的疑问:
SELECT Client, Model, SerialNo, Dep, Level, Colour, Status
FROM TonerRequest
WHERE Status = 'Open'
有人可以建议我怎么做吗?或者在哪里我可以读到如何做到这一点?
答案 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