2013-03-11 15 views
3

我有一个简单的脚本,我试图获取每个客户端上最近的记录。我如何在TSQL中执行此操作?这是我目前的代码,但是,这只是选择一个记录总数。这一条记录显示所有客户的最新记录,而不是每个客户!我该如何重新表达这个问题?如何编写T-SQL查询以为每个客户端选择最高1个记录?

SELECT TOP 1 
C.ClientID, actual_date 
From ClientRecords C 
WHERE (@ClientID is NULL or C.Client_ID = @ClientID) 
Group by C.ClientID, actual_date 
ORDER BY C.actual_date 
+0

http://stackoverflow.com/questions/5091747/t-sql-group-by-category-and-get-top-n-values – 2013-03-11 16:16:30

回答

4

通过使用actual_date MAX()功能列

SELECT C.ClientID, MAX(actual_date) max_DATE 
From ClientRecords C 
WHERE (@ClientID is NULL or C.Client_ID = @ClientID) 
Group by C.ClientID 
ORDER BY C.actual_date 
+1

呵呵,如果我知道你要编辑得这么快,我就不用费神去回答了。但是,你的意思是每个组有一个随机的客户端?这将给每个clientid提供最大日期,如果我理解这个问题,这就是要求的吗? – TimothyAWiseman 2013-03-11 16:18:31

1

这尚未经过测试,但它应该是这个样子:

select 
c.clientId, max(actual_date) as Actual_date 
from clientrecords C 
group by c.clientID 
order by c.clientID 

这将使你是每个客户的最高实际日期,由clientId命令。

0

谢谢你们,但我发现了一个小更满意solutoin这样:

WITH rs AS 
(

SELECT 
C.ClientID, actual_date,ROW_NUMBER() OVER(ORDER BY C.ClientID, actual_date)rid 
From ClientRecords C 
) 

SELECT * FROM rs WHERE rid =1 
+0

是的,ROW_NUMBER通常用于解决这类问题。但是,请注意,如果您指定使用支持窗口函数的DBMS,则有人可能会更早提出此解决方案。 ('tsql'不够,因为它意味着多于一个产品以及多个版本。) – 2013-03-11 21:18:45

0

您可以使用子查询为此:

SELECT 
    C.ClientID , 
    (SELECT MAX(C1.actual_date) FROM ClientRecords C1 WHERE C1.Client_ID = C.Client_ID) AS MaxDate 
FROM ClientRecords C 
WHERE (@ClientID is NULL or C.Client_ID = @ClientID) 
Group by C.ClientID, actual_date 
ORDER BY C.actual_date 
相关问题