[英]Restructure query without sub-query but join?
I am trying to rewrite the following query without using sub-query since I cannot afford hash join. 我试图重写下面的查询而不使用子查询,因为我负担不起哈希联接。
SELECT
COUNT(wins.bid) as wins,
to_char((TIMESTAMP 'epoch' + bidRequestTime * INTERVAL '1 Second'), 'DD') as date,
COUNT(impression.bid) as impression,
lid,
COUNT(b.bid) as requests,
ROUND(SUM(spendCalc),2) as spend
FROM (
SELECT lid, bids.bid,bidRequestTime,price::float*COUNT(impression.bid)/1000::float/.80::float as spendCalc
FROM bids
LEFT OUTER JOIN wins on wins.bid = bids.bid
LEFT OUTER JOIN impressions impression ON impression.bid = bids.bid
WHERE bidRequestTime BETWEEN 1470614400 AND 1471219200
GROUP BY price, bids.bid, bidRequestTime, lid
) b
LEFT OUTER JOIN wins on wins.bid = b.bid
LEFT OUTER JOIN impressions impression ON impression.bid = b.bid
WHERE bidRequestTime BETWEEN 1470614400 AND 1471219200
GROUP BY lid, date
Any suggestions? 有什么建议么? Thanks in Advance.
提前致谢。
Hard to tell exactly what your problem is... but here are some tricks removing the outer joins and using a CTE to reduce the search space.... may or may not work, would need to see more details about your model to be sure. 很难确切说明您的问题是什么...但是这里有一些技巧,可以删除外部联接并使用CTE来减少搜索空间。...可能或可能不起作用,需要查看有关模型的更多详细信息当然。
WITH mybid as
(
SELECT bid, bidRequestTime
FROM bids
WHERE bidRequestTime BETWEEN 1470614400 AND 1471219200
)
SELECT
COUNT(wins_bid) as wins,
to_char((TIMESTAMP 'epoch' + bidRequestTime * INTERVAL '1 Second'), 'DD') as date,
COUNT(imp_bid) as impression,
lid,
COUNT(b.bid) as requests,
ROUND(SUM(spendCalc),2) as spend
FROM (
SELECT wins.bid as wins_bid, lid, bids.bid, bidRequestTime, impression.bid as imp_bid, price::float*COUNT(impression.bid)/1000::float/.80::float as spendCalc
FROM mybid as bids
LEFT OUTER JOIN wins on wins.bid = bids.bid
LEFT OUTER JOIN impressions impression ON impression.bid = bids.bid
GROUP BY price, bids.bid, bidRequestTime, lid
) b
GROUP BY lid, date
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.