T-SQL按LastUpdateDateTime选择顶级类别

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

我想要一种更优雅的方式,通过LastUpdateDateTime降序选择下表中的顶级类别。基本上,我只想按CategoryID查看每个类别的最新单行

我可以通过以下方法得到

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分区以查看类别,这就是所做的更改,我得到了我想要的结果!谢谢你的迅速回复。