您好,我需要使用 2 個選擇陳述句運行查詢,一個具有平均計算并按名稱分組,另一個選擇,在其他表中查找該名稱,并獲取一些列并執行 JOIN 以合并兩者,只留下一列其上的“名稱”。
第一個表是這樣的:
------ ------------- ----------- -----------
| Name | Time | LowPrice | HighPrice |
------ ------------- ----------- -----------
| #AAA | 12/13/2021 | 383.12 | 393.9 |
| #BBB | 12/13/2021 | 1110.34 | 1114.1 |
------ ------------- ----------- -----------
第二個表是這樣的:
------ ------- ----------
| Name | digit | currency |
------ ------- ----------
| #AAA | 2 | USD |
| #BBB | 1 | EUR |
------ ------- ----------
最終查詢應回傳如下內容:
------ ------------- ----------- ----------- ------- ----------
| Name | Time | LowPrice | HighPrice | digit | currency |
------ ------------- ----------- ----------- ------- ----------
| #AAA | 12/13/2021 | 383.12 | 393.9 | 2 | USD |
| #BBB | 12/13/2021 | 1110.34 | 1114.1 | 1 | EUR |
------ ------------- ----------- ----------- ------- ----------
我知道這個查詢應該是這樣的:
SELECT *
FROM (
SELECT name, date_trunc('day', "Time"), avg("LowPrice"), avg("HighPrice")
FROM sometable
GROUP BY "name", date_trunc('day', "Time"
) t
CROSS JOIN (
SELECT name, digit, currrency
FROM othertable
GROUP BY "name"
) m
但不起作用,感謝您的提醒并幫助我除錯
uj5u.com熱心網友回復:
第二個子查詢無效,因為digit它currrency需要成為group by串列的一部分(除非“名稱”是主鍵)。無論如何distinct on ("Name")都會為每個名字提取一條記錄,我想這就是你需要的;您可以通過添加一個order by包含以“Name”開頭的運算式串列的子句來控制為每個名稱選擇哪個記錄。
cross join將產生 4 條記錄的結果而不是 2。我想你需要一個inner join.
SELECT "Name", "Time"::date, "LowPrice", "HighPrice", digit, currency
FROM
(
SELECT "Name",
date_trunc('day', "Time") "Time",
avg("LowPrice") "LowPrice",
avg("HighPrice") "HighPrice"
FROM first_t
GROUP BY "Name", "Time"
) t
INNER JOIN (SELECT distinct on ("Name") "Name", digit, currency FROM second_t) m
USING ("Name");
但是,這將與
select "Name", "Time"::date "Time",
avg("LowPrice") "LowPrice", avg("HighPrice") "HighPrice",
digit, currency
from first_t inner join second_t using ("Name")
group by "Name", "Time", digit, currency;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380142.html
標籤:sql PostgreSQL的
