gpt4 book ai didi

sql-server - 使用 SQL 高效查询记录的最新版本

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

我需要在表中查询所有可用日期(日终时间序列)记录的最新版本。下面的例子说明了我想要实现的目标。

我的问题是表的设计(主键等)和LEFT OUTER JOIN查询是否以最有效的方式实现这一目标。

CREATE TABLE [PriceHistory]
(
[RowID] [int] IDENTITY(1,1) NOT NULL,
[ItemIdentifier] [varchar](10) NOT NULL,
[EffectiveDate] [date] NOT NULL,
[Price] [decimal](12, 2) NOT NULL,

CONSTRAINT [PK_PriceHistory]
PRIMARY KEY CLUSTERED ([ItemIdentifier] ASC, [RowID] DESC, [EffectiveDate] ASC)
)

INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-15',5.50)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-16',5.75)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-16',6.25)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-17',6.05)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-18',6.85)
GO

SELECT
L.EffectiveDate, L.Price
FROM
[PriceHistory] L
LEFT OUTER JOIN
[PriceHistory] R ON L.ItemIdentifier = R.ItemIdentifier
AND L.EffectiveDate = R.EffectiveDate
AND L.RowID < R.RowID
WHERE
L.ItemIdentifier = 'ABC' and R.EffectiveDate is NULL
ORDER BY
L.EffectiveDate

跟进:表可以包含数千个 ItemIdentifiers,每个 ItemIdentifiers 都包含数十个价格数据。出于审计原因,需要保留数据的历史版本。假设我查询表并使用报告中的数据。我在生成报告时存储@MRID = Max(RowID)。现在,如果“2016-03-16”上“ABC”的价格在稍后日期得到更正,我可以使用 @MRID 修改查询并复制我之前运行的报告。

最佳答案

@SeanLange 答案的稍微修改版本将为您提供每个日期的最后一行,而不是每个产品:

with sortedResults as
(
select *
, ROW_NUMBER() over(PARTITION by ItemIdentifier, EffectiveDate
ORDER by ID desc) as RowNum
from PriceHistory
)

select ItemIdentifier, EffectiveDate, Price
from sortedResults
where RowNum = 1
order by 2

关于sql-server - 使用 SQL 高效查询记录的最新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36141706/

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