T-SQL按LastUpdateDateTime选择顶级类别
我想要一种更优雅的方式,通过LastUpdateDateTime降序选择下表中的顶级类别。基本上,我只想按CategoryID查看每个类别的最新单行 我可以通过以下方法得到T-SQL按LastUpdateDateTime选择顶级类别,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想要一种更优雅的方式,通过LastUpdateDateTime降序选择下表中的顶级类别。基本上,我只想按CategoryID查看每个类别的最新单行 我可以通过以下方法得到 SELECT Category, MAX(LastUpdateDateTime) as LastUpdateDateTime INTO #t FROM Settings WHERE CatalogID = 123 GROUP BY Category ORDER BY Category SELECT s.* FROM
SELECT Category,
MAX(LastUpdateDateTime) as LastUpdateDateTime
INTO #t
FROM Settings
WHERE CatalogID = 123
GROUP BY Category
ORDER BY Category
SELECT s.*
FROM Settings s
INNER JOIN #t t
ON s.Category = t.Category
AND s.LastUpdateDateTime = t.LastUpdateDateTime
-->设置表
CREATE TABLE [dbo].[Settings](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CatalogID] [int] NOT NULL,
[Category] [varchar](50) NOT NULL,
[Facings] [bit] NOT NULL,
[Quantity] [bit] NOT NULL,
[LastUpdateDateTime] [datetime] NOT NULL,
CONSTRAINT [PK_Settings_1] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[CatalogID] ASC,
[Category] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
这很简单,只是想找个人给我指出正确的方向,让我更有效地完成这项工作。我所拥有的有用。我想重构
谢谢你的关注
-B子查询如何:
select s1.*
from settings s1
inner join
(
select category, max(LastUpdateDateTime) as LastUpdateDateTime
from settings
where catalogid = 123
group by category
) s2
on s1.category = s2.category
and s1.LastUpdateDateTime = s2.LastUpdateDateTime
甚至使用CTE:
;with cte as
(
select *,
row_number() over(partition by catalogid
order by LastUpdateDateTime desc) rn
from settings
where catalogid = 123
)
select *
from cte
where rn = 1
子查询如何:
select s1.*
from settings s1
inner join
(
select category, max(LastUpdateDateTime) as LastUpdateDateTime
from settings
where catalogid = 123
group by category
) s2
on s1.category = s2.category
and s1.LastUpdateDateTime = s2.LastUpdateDateTime
甚至使用CTE:
;with cte as
(
select *,
row_number() over(partition by catalogid
order by LastUpdateDateTime desc) rn
from settings
where catalogid = 123
)
select *
from cte
where rn = 1
我认为ROW_NUMBER()解决方案更好,以防在LastUpdateDateTime上出现问题。另外,如果你像这样使用*的话,你会在结果中得到rn列(我意识到这样做可能只是为了保持它的简单和紧凑)。@GilM我使用了
select*
,因为OP就是这样做的,但通常我会在select
中指定每一列需要的内容:)@蓝脚怪,第一个建议很有效!带有常用表表达式的建议引起了我的兴趣,但它只返回了一行。知道为什么吗?我的数据集中有5行不同的数据。@brianhevans没有看到任何样本数据,我无法确定问题出在哪里。请随意创建一个带有工作数据模型的,供我测试的。@BlueFoots,我修改了cte分区以查看类别,这就是所做的更改,我得到了我想要的结果!感谢您的快速回复。我认为ROW_NUMBER()解决方案更好,以防在LastUpdateDateTime上出现问题。另外,如果你像这样使用*的话,你会在结果中得到rn列(我意识到这样做可能只是为了保持它的简单和紧凑)。@GilM我使用了select*
,因为OP就是这样做的,但通常我会在select
中指定每一列需要的内容:)@蓝脚怪,第一个建议很有效!带有常用表表达式的建议引起了我的兴趣,但它只返回了一行。知道为什么吗?我的数据集中有5行不同的数据。@brianhevans没有看到任何样本数据,我无法确定问题出在哪里。请随意创建一个带有工作数据模型的,供我测试的。@BlueFoots,我修改了cte分区以查看类别,这就是所做的更改,我得到了我想要的结果!谢谢你的迅速回复。