带有扭曲的 MIN MAX 查询
MIN MAX query with a twist
我需要获取交易量的最小和最大日期,但我需要根据交易量而不是所有相同数量的交易量对其进行分组....
基本上,我有每日交易量和这些每日交易量的日期。我需要能够获取一组卷的最小日期 "to" 和最大日期 "from"。
请注意,卷可以遍历日期,然后中断,然后为同一卷提供一组新的日期。
希望下面的截图比我能更好地解释。我知道如何通过代码来做到这一点……但想知道 SQL 是否也可以做到这一点。
请注意,SQL 将从应用程序内部调用,我无法插入临时 table 以获得最终结果数据集...
这是我使用 select *:
查询的原始数据
这是我最终想要的:
我的查询 运行 为我提供了卷 1100 所有出现的最小值和最大值。我希望它根据日期之间的间隔进行拆分,如最终结果屏幕截图所示... .
这是我的 SQL:
SELECT daily_volume, MIN(volume_date) AS min_date, MAX(volume_date) AS max_date, ins_num
FROM daily_volume
WHERE ins_num = 3854439
GROUP BY daily_volume, ins_num
以下是为 sql 服务器编写的,但它应该适用于其他数据库 (sqlfiddle):
with DatesMinMax as
(
select
volume_date,
daily_volume,
isnull
(
(
select top 1 d2.volume_date
from daily_volume d2
where d.volume_date > d2.volume_date and d.daily_volume <> d2.daily_volume
order by d2.volume_date desc
)
, '1753-01-01'
) as min_date,
isnull
(
(
select top 1 d2.volume_date
from daily_volume d2
where d.volume_date < d2.volume_date and d.daily_volume <> d2.daily_volume
order by d2.volume_date
)
, '9999-12-31'
) as max_date
from daily_volume d
),
DatesFromTo as
(
select d1.daily_volume as qty,
(select min(d2.volume_date)
from DatesMinMax d2
where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date
) as [from],
(select max(d2.volume_date)
from DatesMinMax d2
where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date
) as [to]
from DatesMinMax d1
)
select distinct
qty,
[from],
[to]
from DatesFromTo
order by [from]
DatesMinMax
用于获取与当前交易量不同的第一个日期
DatesFromTo
用于获取每一行的日期范围
我需要获取交易量的最小和最大日期,但我需要根据交易量而不是所有相同数量的交易量对其进行分组....
基本上,我有每日交易量和这些每日交易量的日期。我需要能够获取一组卷的最小日期 "to" 和最大日期 "from"。
请注意,卷可以遍历日期,然后中断,然后为同一卷提供一组新的日期。
希望下面的截图比我能更好地解释。我知道如何通过代码来做到这一点……但想知道 SQL 是否也可以做到这一点。
请注意,SQL 将从应用程序内部调用,我无法插入临时 table 以获得最终结果数据集...
这是我使用 select *:
查询的原始数据这是我最终想要的:
我的查询 运行 为我提供了卷 1100 所有出现的最小值和最大值。我希望它根据日期之间的间隔进行拆分,如最终结果屏幕截图所示... .
这是我的 SQL:
SELECT daily_volume, MIN(volume_date) AS min_date, MAX(volume_date) AS max_date, ins_num
FROM daily_volume
WHERE ins_num = 3854439
GROUP BY daily_volume, ins_num
以下是为 sql 服务器编写的,但它应该适用于其他数据库 (sqlfiddle):
with DatesMinMax as
(
select
volume_date,
daily_volume,
isnull
(
(
select top 1 d2.volume_date
from daily_volume d2
where d.volume_date > d2.volume_date and d.daily_volume <> d2.daily_volume
order by d2.volume_date desc
)
, '1753-01-01'
) as min_date,
isnull
(
(
select top 1 d2.volume_date
from daily_volume d2
where d.volume_date < d2.volume_date and d.daily_volume <> d2.daily_volume
order by d2.volume_date
)
, '9999-12-31'
) as max_date
from daily_volume d
),
DatesFromTo as
(
select d1.daily_volume as qty,
(select min(d2.volume_date)
from DatesMinMax d2
where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date
) as [from],
(select max(d2.volume_date)
from DatesMinMax d2
where d2.volume_date > d1.min_date and d2.volume_date < d1.max_date
) as [to]
from DatesMinMax d1
)
select distinct
qty,
[from],
[to]
from DatesFromTo
order by [from]
DatesMinMax
用于获取与当前交易量不同的第一个日期
DatesFromTo
用于获取每一行的日期范围