修复了SQL中每个uuid的时间戳范围

问题描述 投票:1回答:1

我想生成一个表,其中包含最近n周的数据时间戳(在本例中为n = 3)和所有数据,即使它为空。

我使用以下代码片段

   with raw_weekly_data as (SELECT
   distinct d.uuid,
   date_trunc('week',a.start_timestamp) as tstamp,
   avg(price) as price
   FROM
   a join d on a.uuid = d.uuid
   where start_timestamp between date_trunc('week',now()) -           interval '3 week' and date_trunc('week',now())
   group by 1,2,3
   order by 1)

   ,tstamp as (SELECT
   distinct tstamp
   FROM
   raw_weekly_data
   )

   SELECT
   t.tstamp,
   r.*
   from raw_weekly_data r right join tstamp t on r.tstamp =       t.tstamp
   order by uuid

我想有类似的东西:

week  |  uuid  | price
w1    |  1     | 10
w2    |  1     | 2
w3    |  1     |
w1    |  2     | 20
w2    |  2     |
w3    |  2     |
w1    |  3     | 10
w2    |  3     | 10
w3    |  3     | 20

但相反,并未显示所有空结果。这里最好的方法是什么?

week  |  uuid  | price
w1    |  1     | 10
w2    |  1     | 2
w1    |  2     | 20
w1    |  3     | 10
w2    |  3     | 10
w3    |  3     | 20
postgresql
1个回答
0
投票

形成所有周的UIDID的笛卡尔积,然后LEFT JOIN到实际平均值,每(week, uuid)的价格。喜欢:

SELECT *
FROM   generate_series (date_trunc('week', now() - interval '3 week')
                                         , now() - interval '1 week'
                      , interval '1 week') tstamp
CROSS  JOIN (SELECT DISTINCT uuid FROM a) a
LEFT   JOIN (
   SELECT d.uuid
        , date_trunc('week', a.start_timestamp) AS tstamp
        , avg(price) AS price  -- d.price?
   FROM   a
   JOIN   d USING (uuid)
   WHERE  a.start_timestamp >= date_trunc('week',now()) - interval '3 week'
   AND    a.start_timestamp <  date_trunc('week',now())
   ) ad USING (uuid, tstamp)
GROUP  BY 1, 2
ORDER  BY 1, 2

通过这种方式,您可以获得过去三周和UUID的所有组合,并按平均价格进行扩展 - 如果组合应该存在。 根据一些有根据的猜测填写缺失的信息..

© www.soinside.com 2019 - 2024. All rights reserved.