sql – 在Postgres中查询的高效时间序列

前端之家收集整理的这篇文章主要介绍了sql – 在Postgres中查询的高效时间序列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的PG数据库中有一个表,看起来有点像这样:
  1. id | widget_id | for_date | score |

每个引用的小部件都有很多这些项目.每个小部件每天总是1个,但是存在差距.

我想得到的结果是包含自X以来每个日期的所有小部件.日期通过生成系列引入:

  1. SELECT date.date::date
  2. FROM generate_series('2012-01-01'::timestamp with time zone,'now'::text::date::timestamp with time zone,'1 day') date(date)
  3. ORDER BY date.date DESC;

如果没有给定widget_id的日期条目,我想使用前一个.所以说小工具1337在2012-05-10没有条目,但在2012-05-08,那么我希望结果集在2012-05-10也显示2012-05-08条目:

  1. Actual data:
  2. widget_id | for_date | score
  3. 1312 | 2012-05-07 | 20
  4. 1337 | 2012-05-07 | 12
  5. 1337 | 2012-05-08 | 41
  6. 1337 | 2012-05-11 | 500
  7.  
  8. Desired output based on generate series:
  9. widget_id | for_date | score
  10. 1336 | 2012-05-07 | 20
  11. 1337 | 2012-05-07 | 12
  12. 1336 | 2012-05-08 | 20
  13. 1337 | 2012-05-08 | 41
  14. 1336 | 2012-05-09 | 20
  15. 1337 | 2012-05-09 | 41
  16. 1336 | 2012-05-10 | 20
  17. 1337 | 2012-05-10 | 41
  18. 1336 | 2012-05-11 | 20
  19. 1337 | 2012-05-11 | 500

最终我想把它归结为一个视图,所以我每天都有一致的数据集,我可以轻松查询.

编辑:使样本数据和预期结果集更清晰

解决方法

SQL Fiddle
  1. select
  2. widget_id,for_date,case
  3. when score is not null then score
  4. else first_value(score) over (partition by widget_id,c order by for_date)
  5. end score
  6. from (
  7. select
  8. a.widget_id,a.for_date,s.score,count(score) over(partition by a.widget_id order by a.for_date) c
  9. from (
  10. select widget_id,g.d::date for_date
  11. from (
  12. select distinct widget_id
  13. from score
  14. ) s
  15. cross join
  16. generate_series(
  17. (select min(for_date) from score),(select max(for_date) from score),'1 day'
  18. ) g(d)
  19. ) a
  20. left join
  21. score s on a.widget_id = s.widget_id and a.for_date = s.for_date
  22. ) s
  23. order by widget_id,for_date

猜你在找的MsSQL相关文章