1

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

我无法编写以 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
4

2 回答 2

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;

在 rextester 上查看它的实际效果

于 2019-02-23T19:54:23.607 回答
0

这是一个使用生成的系列的示例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
于 2019-02-23T20:38:21.547 回答