Tsql 如何编写T-SQL查询来为每个客户机选择前1条记录?

Tsql 如何编写T-SQL查询来为每个客户机选择前1条记录?,tsql,group-by,greatest-n-per-group,Tsql,Group By,Greatest N Per Group,我有一个简单的脚本,我正在尝试获取每个客户端的最新记录。如何在TSQL中实现这一点?这是我目前的代码,但是,这只是选择了一个记录总数。这一条记录显示所有客户端的最新记录,而不是每个客户端!请问我该如何重新表述 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 O

我有一个简单的脚本,我正在尝试获取每个客户端的最新记录。如何在TSQL中实现这一点?这是我目前的代码,但是,这只是选择了一个记录总数。这一条记录显示所有客户端的最新记录,而不是每个客户端!请问我该如何重新表述

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
在实际日期使用
MAX()
函数聚合列


这还没有经过测试,但它应该看起来像:

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

这将为您提供客户ID订购的每个客户的最高实际日期。

谢谢各位,但我发现了一个更令人满意的解决方案:

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

您可以为此目的使用子查询:

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

嘿,如果我知道你要这么快编辑,我就不会费心回答了。但你说的每个群体都有随机的客户是什么意思?这将给出每个客户ID的最长日期,如果我理解问题的正确性,这就是所要求的?是的,行号通常用于解决此类问题。但是,请注意,如果您指定使用的是支持窗口函数的DBMS,则可能会有人更早地提出此解决方案。(
tsql
是不够的,因为它意味着不止一个产品,以及不止一个版本。)
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