我正在尝试建立一个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)游标需要代码,并且您已请求一个视图(b)游标放弃了集处理引擎,并恢复为逐行处理。同样,不是必需的。如果我的任何团队中的开发人员都在关系数据库(即非记录归档系统)上使用了游标或临时表,我会射击它们。
您的 数据 是关系型的,逻辑的,两个给定的 数据 列就足够了。
当然,我们有以形成一视图(派生关系),以获得所需的报告,但由纯进行选择,这是处理(将其转换为一个完全不同的 文件 ,这是物理的,然后处理所述 文件 ;或者临时表;或工作表;或CTE;或ROW_Number();等)。
与有一个议程的“理论家”的哀叹相反,SQL可以很好地处理关系数据。而您的数据就是关系型的。
因此,请保持“关系”心态,数据的“关系”视图和集合处理心态。可以使用单个SELECT来满足关系数据库上的每个报告要求。无需退回1970年以前的ISAM文件处理方法。
我将假设主键(给出关系行唯一性的一组列)为Date,
,根据给出的示例数据,数据类型为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_
任何数据范围(在此,a的Date
范围)的基础上的任何数据变化(在这里,在一变化Price
)。
在这里,您Dates
是连续的,因此确定Date_Next
很简单:将递增Date
1天。如果PK在增加但 不
连续(例如DateTime
或TimeStamp
或其他某个键),则将派生表更改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
请随时发表评论,提出问题等。
问题内容: 我有一个ID为,状态和员工日期范围的数据集。 下面给出的输入数据集是一名员工的详细信息。 记录中的日期范围是连续的(按确切顺序),因此第二行的开始日期将是第一行的结束日期的下一个日期。 如果员工连续休假不同的月份,则该表将存储日期范围不同的信息。 例如:在输入集中,员工已从‘16 -10-2016’休病假到‘31 -12-2016’,并在‘1-1-2017’重新加入。 因此,该项目有3
问题内容: 我有一个带有卖单的表格,我想列出两个日期之间每天的卖单数量,并且不留日期间隔。 这是我目前所拥有的: 我得到的结果如下: 但是我想要得到的是: 那可能吗? 问题答案: 动态创建日期范围并针对您的订单表进行合并:- 这可以处理多达1000天的日期范围。 请注意,根据您用于日期的字段类型,可以轻松提高效率。 编辑-根据要求,以获取每月的订单数:-
问题内容: 我在elasticsearch中存储以下信息: 假设我还有另一个日期范围(例如,从用户输入中得出),我想搜索一个相交的时间范围。与此类似:确定两个日期范围是否重叠这概述了以下逻辑: 但是我不确定如何将其放入elasticsearch查询中,我会使用范围过滤器并且仅将“ to”值设置为,而将from留为空白吗?还是有一种更有效的方法? 问题答案: 更新:现在可以使用在elasticsea
问题内容: 我有一个表,其中每一行都有开始和结束日期时间。这些可以是短跨度或长跨度。 我想查询具有两个开始和停止日期时间的所有行的交集的总持续时间。 如何在MySQL中做到这一点? 还是必须选择与查询开始和结束时间相交的行,然后计算每行的实际重叠并将其累加到客户端? 举个例子,使用毫秒使它更清晰: 一些行: 我们想知道这些行在1030和1100之间的总时间。 让我们计算每行的重叠: 因此,本例中的
这是当我尝试使用'where'而不是'where field'时收到的错误,尽管从文档中看,'where'似乎是查询Firestore数据库的有效命令。是不是我需要下载其他的豆荚?我有的是:pod'firebase/analytics'pod'firebase/auth'pod'firebase/core'pod'firebase/firestore'
我在一个表(即TAB1)中有多个日期范围,如下所示。 对上面的SQL查询有什么建议吗?