【问题标题】:Postgresql - 24 hour rolling windowPostgresql - 24 小时滚动窗口
【发布时间】:2019-02-24 07:02:39
【问题描述】:

我目前正在使用 Metabase 将一些公司内部指标的实时仪表板放在一起,我试图查询的其中一件事是我们的移动应用程序上的 24 小时滚动窗口。 Metabase 有一个有用的可视化工具,称为“智能数字”,它允许您比较定义时间段内值的变化。 Like this.

我无法编写以 24 小时为间隔输出数据的查询,因此我可以将过去 24 小时与之前的 24 小时进行比较。我尝试使用 date_trunc 函数按小时划分事务,然后可能将结果限制为最后 24 个,但它不会打印出没有事务的小时数。我还尝试使用下面代码中的过滤器功能,但需要转置数据才能使“智能数字”工作。有人对我应该如何解决这个问题有任何建议吗?

我的一种方法的示例:

SELECT 

(DATE_TRUNC('hour', (reservations.created_at::timestamptz)))  as hour,
SUM(reservations.covers) as total_covers  

FROM reservations
JOIN restaurants on restaurants.id = reservations.restaurant_id

WHERE reservations.origin = 'mobile'
and restaurants.relationship_type in ('listing_only', 'difficult', 'ipad')

GROUP BY hour

ORDER BY hour desc

输出如下:

hour                       total_covers
"2019-02-19 15:00:00+00"    4
"2019-02-19 13:00:00+00"    15
"2019-02-19 12:00:00+00"    4
"2019-02-19 11:00:00+00"    4
"2019-02-19 10:00:00+00"    26
"2019-02-19 09:00:00+00"    5
"2019-02-19 08:00:00+00"    8
"2019-02-19 07:00:00+00"    12
"2019-02-19 03:00:00+00"    2

我想得到这样的东西:

Time_Interval         Total_Covers
24 Hours                  389
48 Hours                  254
72 hours                  459
96 Hours                  239

【问题讨论】:

标签: postgresql metabase


【解决方案1】:

此查询使用date 函数对结果进行分组。

SELECT 
  DATE(reservations.created_at) AS day,
  SUM(reservations.covers) AS total_covers
FROM reservations
WHERE 
  reservations.origin = 'mobile' AND 
  restaurants.relationship_type IN ('listing_only', 'difficult', 'ipad')
GROUP BY day
ORDER BY day DESC

此查询从查询​​时间开始计算总封面,并按天数对它们进行分组。

SELECT
  CEIL(EXTRACT(EPOCH FROM NOW() - reservations.created_at) / 86400) as days_ago
  SUM(reservations.covers) as total_covers,
FROM reservations
WHERE 
  reservations.origin = 'mobile' AND 
  restaurants.relationship_type IN ('listing_only', 'difficult', 'ipad')
GROUP BY days_ago
ORDER BY days_ago;

See it in action on rextester.

【讨论】:

  • 嘿,理查德!非常感谢您的回复。这个查询确实有效,唯一的问题是它输出的滚动 24 小时窗口不像它每天输出的事务那样多。我试图将过去的 24 小时与之前的 24 小时进行比较,即使间隔跨越 2 天。这有意义吗?
【解决方案2】:

这里是使用from 生成序列的示例,然后左连接要计算的数据。想法是您希望每个小时都出现在结果中,并且要计算每条数据,但它是可选的。

注意我刚刚检查了编译的查询;我手头没有模拟架构来测试它。

SELECT 
hours.x as hour,
coalesce(SUM(reservations.covers), 0) as total_covers
FROM (
    select * from generate_series(date_trunc('hour', (now() - INTERVAL '24 hours')), now(), '1 hour')
) hours(x)
LEFT JOIN reservations on hours.x = (DATE_TRUNC('hour', (reservations.created_at::timestamptz)))
LEFT JOIN restaurants on restaurants.id = reservations.restaurant_id
WHERE reservations.origin = 'mobile'
and restaurants.relationship_type in ('listing_only', 'difficult', 'ipad')
GROUP BY hours.x
ORDER BY hours.x desc

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多