gpt4 book ai didi

sql - 一组相同数据的日期范围

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

我正在尝试构建一个 SQL 查询,它将为我提供具有相同价格的日期的日期范围。如果价格出现突破,我预计会出现新的变化。即使一个月内的某个时间有相同的价格,如果中间的某个时间价格发生变化,我希望将其视为具有特定日期范围的两个单独的行。

示例数据:

Date    Price
1-Jan 3.2
2-Jan 3.2
3-Jan 3.2
4-Jan 3.2
5-Jan 3.2
6-Jan 3.2
7-Jan 3.2
8-Jan 3.2
9-Jan 3.5
10-Jan 3.5
11-Jan 3.5
12-Jan 3.5
13-Jan 3.5
14-Jan 4.2
15-Jan 4.2
16-Jan 4.2
17-Jan 3.2
18-Jan 3.2
19-Jan 3.2
20-Jan 3.2
21-Jan 3.2
22-Jan 3
23-Jan 3
24-Jan 3
25-Jan 3
26-Jan 3
27-Jan 3
28-Jan 3
29-Jan 3.5
30-Jan 3.5
31-Jan 3.5

期望的结果:

Price   Date Range
3.2 1-8
3.5 9-13
4.2 14-16
3.2 17-22
3 22-28
3.5 29-31

最佳答案

非关系型解决方案

我认为其他答案都不正确。

  • GROUP BY 不起作用

  • 使用ROW_NUMBER()强制将数据放入物理记录归档系统结构中,然后将其作为物理记录进行处理。以巨大的性能成本为代价。当然,为了编写这样的代码,它迫使您从 RFS 的角度思考,而不是从关系的角度思考。

  • 使用 CTE 是相同的。迭代数据,尤其是不改变的数据。成本略有不同。

  • 出于不同的原因,游标绝对是错误的东西。 (a) 游标需要代码,并且您已请求 View (b) 游标放弃集合处理引擎,并恢复到逐行处理。再说一遍,不是必需的。如果我团队中的任何开发人员在关系数据库(即不是记录归档系统)上使用游标或临时表,我就会射击他们。

关系解决方案

  1. 您的数据是关系型、逻辑性的,两个给定的数据列就是必需的。

  2. 当然,我们必须形成一个 View (派生关系),以获得所需的报告,但它由纯 SELECT 组成,这与处理(将其转换为文件,这是物理的,然后处理文件;或临时表;或工作表;或 CTE;或 ROW_Number();等等。

  3. 与有议程的“理论家”的哀叹相反,SQL 可以完美地处理关系数据。并且您的数据是关系型的。

因此,保持关系思维、数据的关系 View 和集合处理思维。关系数据库上的每个报告要求都可以使用单个 SELECT 来满足。无需退回到 1970 年之前的 ISAM 文件处理方法。

我将假设主键(提供关系行唯一性的列集)是日期,并且根据给定的示例数据,数据类型是DATE。

试试这个:

    CREATE VIEW MyTable_Base_V          -- Foundation View
AS
SELECT Date,
Date_Next,
Price
FROM (
-- Derived Table: project rows with what we need
SELECT Date,
[Date_Next] = DATEADD( DD, 1, O.Date ),
Price,
[Price_Next] = (

SELECT Price -- NULL if not exists
FROM MyTable
WHERE Date = DATEADD( DD, 1, O.Date )
)

FROM MyTable MT

) AS X
WHERE Price != Price_Next -- exclude unchanging rows
GO

CREATE VIEW MyTable_V -- Requested View
AS
SELECT [Date_From] = (
-- Date of the previous row
SELECT MAX( Date_Next ) -- previous row
FROM MyTable_V
WHERE Date_Next < MT.Date
),

[Date_To] = Date, -- this row
Price
FROM MyTable_Base_V MT
GO

SELECT *
FROM MyTable_V
GO

方法,通用

当然这是一个方法,因此它是通用的,它可以用来确定任何数据范围的From_To_(这里是一个日期范围),基于任何数据更改(此处为价格的更改)。

这里,您的日期是连续的,因此Date_Next的确定很简单:将日期增加1天。如果 PK 增加但不连续(例如 DateTimeTimeStamp 或其他某个键),请更改派生表 X 至:

    -- Derived Table: project rows with what we need
SELECT DateTime,
[DateTime_Next] = (
-- first row > this row
SELECT TOP 1
DateTime -- NULL if not exists
FROM MyTable
WHERE DateTime > MT.DateTime
),

Price,
[Price_Next] = (
-- first row > this row
SELECT TOP 1
Price -- NULL if not exists
FROM MyTable
WHERE DateTime > MT.DateTime
)

FROM MyTable MT

享受吧。

请随意发表评论、提出问题等。

关于sql - 一组相同数据的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455227/

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