首先許多與您的查詢問題,假設有沒有你還沒有告訴我們任何部件:您不需要CTE此查詢
- 。
- 從表
apps
您只能使用id
列,其值與c.app_id
相同。您可以刪除表apps
並選擇c.app_id
獲得相同的結果。
- 當您使用
to_char()
時,您不必首先將date_trunc()
設置爲date
,to_char()
函數可以處理該問題。
generate_series()
也適用於timestamps
。只需輸入一個時間間隔的日期值,並在使用前將結果轉換爲date
即可。
所以,清除所有我們結束了這個這不完全一樣,你的問題查詢,但現在我們至少可以看到正在發生的事情的廢料。
SELECT c.app_id, to_date(d.date, 'YYYY-MM-DD') AS date,
extract(epoch from (first_response_at - started_at)) AS response_time
FROM generate_series(CURRENT_DATE - 2, CURRENT_DATE, interval '1 day') d(date)
LEFT JOIN conversations c ON d.date::date = c.started_at::date
AND c.app_id = 'ASnYW1-RgCl0I'
AND c.first_response_at > CURRENT_DATE - 2;
您不計算任何地方的中位響應時間,所以這是一個需要解決的大問題。這隻需要從表conversations
數據看起來有點像這樣來計算,在過去2天中位數響應時間:
SELECT app_id, started_at::date AS start_date,
percentile_disc(0.5) WITHIN GROUP (ORDER BY first_response_at - started_at) AS median_response
FROM conversations
WHERE app_id = 'ASnYW1-RgCl0I'
AND first_response_at > CURRENT_DATE - 2
GROUP BY 2;
當我們折了兩個查詢,並把參數輕而易舉地在一個地方,這是最終的結果:
SELECT p.id, to_date(d.date, 'YYYY-MM-DD') AS date,
extract(epoch from (c.median_response)) AS response_time
FROM (VALUES ('ASnYW1-RgCl0I', 2)) p(id, days)
JOIN generate_series(CURRENT_DATE - p.days, CURRENT_DATE, interval '1 day') d(date) ON true
LEFT JOIN LATERAL (
SELECT started_at::date AS start_date,
percentile_disc(0.5) WITHIN GROUP (ORDER BY first_response_at - started_at) AS median_response
FROM conversations
WHERE app_id = p.id
AND first_response_at > CURRENT_DATE - p.days
GROUP BY 2) c ON d.date::date = c.start_date;
如果要更改應用程序或天數的id回頭看看,你只需要相應地改變VALUES
條款。您也可以將整個事件包裝在SQL函數中,並將VALUES
子句轉換爲兩個參數。
您是否嘗試過使用DISTINCT? –
這不會解決它,因爲我不知道重複行中的哪一個(如果有)具有正確的中位響應時間 – Tarlen
您正在通過左側加入true來執行帶'apps'的'CROSS JOIN'。如果您希望我們進一步調查,請附上sqlfiddle或腳本以生成樣本數據和預期結果 –