Sql 选择最新记录
我正在尝试将3行聚合为一行(选择最新记录)。但我还是得到了3张唱片,而不是1张。有什么想法吗?**SQL Server**Sql 选择最新记录,sql,sql-server,max,Sql,Sql Server,Max,我正在尝试将3行聚合为一行(选择最新记录)。但我还是得到了3张唱片,而不是1张。有什么想法吗?**SQL Server** select [TotalTechPremium] From Premiumfile where [TimeDate Stamp] = (select Max([TimeDate Stamp]) From Premiumfile where PolicyNo = '47
select [TotalTechPremium] From Premiumfile
where [TimeDate Stamp] = (select Max([TimeDate Stamp])
From Premiumfile
where PolicyNo = '47-ZCA-000276-02'
);
您有多条具有相同时间戳的记录 这可能有助于:
select pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
pf.[TimeDate Stamp] = (select Max(pf2.[TimeDate Stamp])
From pf2.Premiumfile
where pf2.PolicyNo = pf.PolicyNo
);
但如果你想要一排,我会:
select top (1) pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
order by pf.[TimeDate Stamp] desc;
您有多条具有相同时间戳的记录 这可能有助于:
select pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
pf.[TimeDate Stamp] = (select Max(pf2.[TimeDate Stamp])
From pf2.Premiumfile
where pf2.PolicyNo = pf.PolicyNo
);
但如果你想要一排,我会:
select top (1) pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
order by pf.[TimeDate Stamp] desc;
在询问T-SQL问题时,样本数据和预期结果也非常重要 由于您没有提供,这只是猜测,但获取“最新”记录的常见方法是使用CTE和
行号
。示例查询如下所示:
WITH CTE AS(
SELECT [YourColumns]
ROW_NUMBER() OVER (PARTITION BY [RelevantColumns] ORDER BY [TimestampColumn] DESC) AS RN
FROM [YourTable])
SELECT [YourColumns]
FROM CTE
WHERE RN = 1;
如果这样做没有帮助,请查看论坛礼仪,了解如何发布t-SQL问题。在询问t-SQL问题时,示例数据和预期结果也非常重要 由于您没有提供,这只是猜测,但获取“最新”记录的常见方法是使用CTE和
行号
。示例查询如下所示:
WITH CTE AS(
SELECT [YourColumns]
ROW_NUMBER() OVER (PARTITION BY [RelevantColumns] ORDER BY [TimestampColumn] DESC) AS RN
FROM [YourTable])
SELECT [YourColumns]
FROM CTE
WHERE RN = 1;
如果这没有帮助,请查看论坛礼仪,了解如何发布t-SQL问题。如果该查询输出3条记录,则表示PremiumFile表中有3条记录的时间戳等于该策略编号的最大时间戳。 也许您忘记了添加一个额外的位置,在那里您可以根据该策略编号再次进行筛选。 或者,您可以将查询替换为:
select top 1 TotalTechPremium
from Premiumfile
where PolicyNo='47-ZCA-000276-02'
order by Timestamp desc
如果该查询输出3条记录,则表示表PremiumFile中有3条记录的时间戳等于该策略编号的最大时间戳。 也许您忘记了添加一个额外的位置,在那里您可以根据该策略编号再次进行筛选。 或者,您可以将查询替换为:
select top 1 TotalTechPremium
from Premiumfile
where PolicyNo='47-ZCA-000276-02'
order by Timestamp desc
以下是使用
行数()的两种不同方法
如果设置“包含实际执行计划”并执行上述操作,则可以看到执行计划是相同的。以下是使用行数()的两种不同方法。
如果设置“包含实际执行计划”并执行上述操作,您可以看到执行计划是相同的。为什么不使用TOP 1?为什么不使用TOP 1?这里也不需要使用CTE,只需使用ROW_NUMBER()就足够了,并在其周围加上另一个SELECT。ROW_NUMBER()非常有用,而且速度很快。@TDP CTE是必需的,您不能在的位置中引用ROW_NUMBER
,进行2次选择意味着扫描表格两次;这不是必需的。CTE是更好的选择。执行计划相同。我添加了一个测试场景作为答案。除非#表的执行计划不同?…哦,@TDP,您的意思是使用子查询。就个人而言,我更喜欢CTE;我发现它们更容易阅读。这里也不需要使用CTE,只需使用ROW_NUMBER()就足够了,再加上一个SELECT。ROW_NUMBER()非常有用,而且速度很快。@TDP CTE是必需的,您不能在的位置中引用ROW_NUMBER
,进行2次选择意味着扫描表格两次;这不是必需的。CTE是更好的选择。执行计划相同。我添加了一个测试场景作为答案。除非#表的执行计划不同?…哦,@TDP,您的意思是使用子查询。就个人而言,我更喜欢CTE;我发现它们更容易阅读。我个人能想到的唯一原因是第一个查询需要两次扫描。我真希望人们在否决投票时发表评论;我完全赞成批评;只要是建设性的。@Lamu。有了正确的索引,这应该比使用row\u number()。我真希望人们在否决投票时发表评论;我完全赞成批评;只要是建设性的。@Lamu。有了正确的索引,这应该比使用row\u number()。