我正在查询Redash,以提取一个带有定价网格的停车位的汇总列表。清单表由停车详细信息(姓名、地址、链接)和多个收费栏组成,视逗留时间而定。
我用两张桌子(公园和优惠)。优惠表有三个字段,park_id、价格和持续时间。每个park_id的价格可能对应于一定的停留时间。举个例子,公园#1将收取3600秒的2美元,86400秒的30美元等等。
我已经写了单独的子查询,以获得这些价格的每段时间,从1小时到24小时(1天),然后持续到31天,然后93天,186天和372天。总共有57个子查询。
结果表包含57列价格(price1h,price2h…)。.price1d,价格2d…。。price31d,price93d,price186d,price372d)。
条件:有两个重要的条件,我必须用它来得到价格。一个是offers.duration = 3600/7200等,然后我筛选哪些包类型而不是订阅类型的报价。最后,offers.park_id = parks.id将表中的两个关键字段链接起来。
问题是,我多次重复这个子查询的时间不同,执行非常缓慢,超过了“Redash查询执行时间限制”。
查询的一个片段如下:
SELECT DISTINCT parkid AS ID,
park_name AS Name,
park_address AS full_address,
park_url_description AS park_url,
(SELECT offers.price
FROM offers
WHERE offers.type = 'package'
AND offers.duration = 3600
AND offers.park_id = park.parkid) AS price1h,
(SELECT offers.price
FROM offers
WHERE offers.type = 'package'
AND offers.duration = 7200
AND offers.park_id = park.parkid) AS price2h,
(SELECT offers.price
FROM offers
WHERE offers.type = 'package'
AND offers.duration = 10800
AND offers.park_id = park.parkid) AS price3h,
…….. /* and so on */
FROM park
LEFT JOIN offers ON park.parkid = offers.park_id
GROUP BY id, Name, full_address, park_url结果表如下所示:https://i.stack.imgur.com/0opp0.png
有人能提出一个更好的选择来获得这些价格吗?我试过使用CTE方法,但是我没有足够的经验,所以我无法想出一个解决方案(我是一个实习生,还在学习)。提前谢谢你。
发布于 2020-11-16 14:16:21
假设每个park+duration都有一个报价,则可以通过有条件地使用聚合函数来完成:
SELECT
p.parkid AS ID,
p.park_name AS Name,
p.park_address AS full_address,
p.park_url_description AS park_url,
max(if (o.duration = 3600, o.price, null)) as price1h,
max(if (o.duration = 7200, o.price, null)) as price2h,
max(if (o.duration = 10800, o.price, null)) as price3h
FROM park p
LEFT JOIN offers o ON p.parkid = o.park_id and o.type = 'package'
AND o.duration in (3600, 7200, 10800)
GROUP BY p.parkid, p.park_name, p.park_address, p.park_url_description请参阅[医]小提琴
https://stackoverflow.com/questions/64858762
复制相似问题