gpt4 book ai didi

sql-server - 选择不同类型的最新条目

转载 作者:行者123 更新时间:2023-12-03 02:20:05 24 4
gpt4 key购买 nike

我正在设计一个表格,其中包含一些随时间变化的对象的属性。

CREATE TABLE [dbo].[ObjectProperties]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[ObjectType] SMALLINT NOT NULL,
[Width] SMALLINT NOT NULL,
[Height] SMALLINT NOT NULL,
[Weight] SMALLINT NOT NULL
)

假设我有这个对象类型:1 = 椅子2 = 表格

以及该表的数据:

INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (1, 1, 50, 50, 1000)
INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (2, 2, 80, 40, 500)
INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (3, 1, 50, 50, 2000)

所以,正如你所看到的,我有一个椅子对象,其重量为 1000,然后我将重量更改为 2000。并且我正在存储诸如对象属性的修改历史记录之类的内容。现在我想从该表中为每个对象选择最新数据。我知道如何为每个对象一一选择最新数据:

SELECT TOP 1 * FROM [ObjectProperties] WHERE ObjectType = 1 ORDER BY Id DESC

但是如果我想通过一个查询选择几个对象怎么办?喜欢

SELECT ... * FROM [ObjectProperties] WHERE ObjectType IN (1, 2) ...

并接收 ID 为 2 和 3 的行(因为 3 的椅子属性比 1 更新)

最佳答案

您可以将 CTE 与 ROW_NUMBER 排名功能结合使用:

WITH CTE AS(
SELECT *,
RN=ROW_NUMBER()OVER(PARTITION BY ObjectType ORDER BY ID DESC)
FROM [ObjectProperties] op
)
SELECT * FROM CTE WHERE RN = 1
AND ObjectType IN (1, 2)

Demo

ROW_NUMBER 为每个 ObjectTypeID DESC 分组的顺序返回一行(因此具有最高 ID 的记录)。如果您如果想要按某些 ID 进行过滤,您只需在 CTE 或外部 SELECT 中应用适当的 WHERE 子句即可。

Ranking Functions

关于sql-server - 选择不同类型的最新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17697825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com