Sql t日期

Sql t日期,sql,postgresql,Sql,Postgresql,从这里开始,我将实际数据分组到每个日期桶中,将价格相加并除以10。如果你有遗漏的日期,应该说明原因。如果您在同一天有副本。。。好吧,然后它会人为地膨胀你的“平均值”。如果你定义了一个关于如何处理被骗者的规则,那就很容易管理了。这是一个相当残酷的力量,我敢打赌一美元,由于>和

从这里开始,我将实际数据分组到每个日期桶中,将价格相加并除以10。如果你有遗漏的日期,应该说明原因。如果您在同一天有副本。。。好吧,然后它会人为地膨胀你的“平均值”。如果你定义了一个关于如何处理被骗者的规则,那就很容易管理了。

这是一个相当残酷的力量,我敢打赌一美元,由于>和<在连接中,它的效率非常低,但从概念上讲,它听起来像你想要做的:

with intervals as (
  select start_date, start_date + interval '10 days' as end_date
  from generate_series (
    (select min (date) from price_data),
    (select max (date) from price_data),
    interval '10 days') gs (start_date)
)
select
  i.start_date, sum (p.price) / 10 as average
from
  price_data p
  join intervals i on
    p.date >= i.start_date and
    p.date <  i.end_date
group by
  i.start_date
我不能保证这些是最好的方法,但它们是最好的方法

简言之,我将数据集中的最短日期和最长日期分为10天。这确实是以“每10天”的时钟从你的第一次约会开始为前提的


从这里开始,我将实际数据分组到每个日期桶中,将价格相加并除以10。如果你有遗漏的日期,应该说明原因。如果您在同一天有副本。。。好吧,然后它会人为地膨胀你的“平均值”。如果你定义了一个关于如何处理重复的规则,那就很容易管理了。

这个怎么样?无论间隔如何,它都连续10天

CREATE TABLE date (
  date  DATE             NOT NULL,
  price DOUBLE PRECISION NOT NULL
);

INSERT INTO date (date, price)
SELECT (now()::DATE) + s.i,
  s.i :: DOUBLE PRECISION
FROM generate_series(0, 1000) AS s(i);

SELECT ((extract(EPOCH FROM date) / (60 * 60 * 24)) :: BIGINT) / 10
    , avg(price) AS average_price
FROM date
GROUP BY 1
ORDER BY 1;

这个怎么样?无论间隔如何,它都连续10天

CREATE TABLE date (
  date  DATE             NOT NULL,
  price DOUBLE PRECISION NOT NULL
);

INSERT INTO date (date, price)
SELECT (now()::DATE) + s.i,
  s.i :: DOUBLE PRECISION
FROM generate_series(0, 1000) AS s(i);

SELECT ((extract(EPOCH FROM date) / (60 * 60 * 24)) :: BIGINT) / 10
    , avg(price) AS average_price
FROM date
GROUP BY 1
ORDER BY 1;

如果有间隔或重复的天数怎么办?如果有间隔或重复的天数怎么办?
with intervals as (
  select
    start_date::date as start_date,
   (start_date + interval '10 days')::date as end_date
  from generate_series (
    (select min (date) from price_data),
    (select max (date) from price_data),
    interval '10 days') gs (start_date)
),
exploded_intervals as (
  select 
    start_date + i as snapshot_date, start_date, end_date
  from
    intervals i
    cross join generate_series (0, 9) gs (i)
)
select
  i.start_date, sum (p.price) / 10 as average
from
  price_data p
  join exploded_intervals i on
    p.date = i.snapshot_date
group by
  i.start_date
CREATE TABLE date (
  date  DATE             NOT NULL,
  price DOUBLE PRECISION NOT NULL
);

INSERT INTO date (date, price)
SELECT (now()::DATE) + s.i,
  s.i :: DOUBLE PRECISION
FROM generate_series(0, 1000) AS s(i);

SELECT ((extract(EPOCH FROM date) / (60 * 60 * 24)) :: BIGINT) / 10
    , avg(price) AS average_price
FROM date
GROUP BY 1
ORDER BY 1;