Как написать подзапрос, используя WITH в PostgreSQL - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь получить данные твиттера narendramodi, используя следующую команду.

SELECT b.t_id,a.profile_image,b.tweet_text,e.media_media_url,b.retweet_count,b.favorite_count as like_count,count(reply_to_status_id) as reply_count,f.tweet_impression_count,f.tweet_engagement_count,f.tweet_engagement_rate 
FROM twitter_users a LEFT JOIN twitter_tweets b on a.user_id=b.user_id 
LEFT JOIN twitter_tweet_replies c on b.t_id = c.t_id 
LEFT JOIN twitter_tweet_media e on b.t_id = e.t_id 
LEFT JOIN twitter_tweet_metric_aggregates f on f.metric_timestamp= 
(select max(metric_timestamp) FROM twitter_tweet_metric_aggregates g 
WHERE g.t_id=f.t_id and g.t_id=b.t_id) 
WHERE a.twitter_screen_name= 'narendramodi' 
GROUP BY  b.t_id,a.profile_image 
,b.tweet_text,b.retweet_count,b.favorite_count,
e.media_media_url,f.imp_count,f.eng_count,f.eng_rate);

Запрос работал правильно, но в приведенном выше запросе я использовал sub-select для получения последних данных imp_counts на основе отметки времени,Из-за этого Query_cost был огромным, и поэтому выполнение запроса занимало более 15 минут.Я хочу уменьшить это и должен быть в состоянии выполнить в течение 10 секунд.По этой причине я пытался использовать выражение WITH (CTE).

Вот оно

WITH metric_counts AS (
SELECT max(metric_timestamp),f.t_id 
FROM twitter_tweet_metric_aggregates f LEFT JOIN twitter_tweets b on 
f.t_id=b.t_id 
)
SELECT 
b.t_id,a.profile_image,b.tweet_text,e.media_media_url,b.retweet_count
,b.favorite_count as like_count, count(reply_to_status_id) as 
reply_count,metric_counts.imp_count
,metric_counts.eng_count,metric_counts.eng_rate 

FROM twitter_users as a 
LEFT JOIN twitter_tweets as b on a.twitter_user_id=b.twitter_user_id 
LEFT JOIN twitter_tweet_replies c on b.t_id = c.t_id 
LEFT JOIN twitter_tweet_media e on b.t_id = e.t_id 
LEFT JOIN metric_counts on metric_counts.t_id = b.t_id WHERE 
lower(a.twitter_screen_name)=lower('narendramodi') 
GROUP BY b.t_id,a.profile_image,b.tweet_text,e.media_media_url,
b.retweet_count,b.favorite_count, 
metric_counts.imp_count,metric_counts.eng_count,
metric_counts.eng_rate;

Запрос выполнялся, но он не дает значения imp_count, eng_count, eng_rate из этой конкретной таблицы.

ПРИМЕЧАНИЕ. ЕслиЯ удаляю этот запрос sub-select, который выполнялся в течение 10sec. Но я хочу, чтобы он также был включен.Для этого я использовал WITH, но не смог. Так что кто-нибудь может мне помочь, как написать первый запрос, используя выражение WITH.

...