[英]union not working as expected in PostgreSQL
我有一個聯合查詢:
(SELECT
to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh",
count(postid) as Freq
FROM conversations
WHERE type = 'Post'
GROUP BY Yr, Mh
HAVING Yr = '2018')
UNION
(SELECT
to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh",
count(postid) as Freq
FROM conversations
WHERE type <> 'Post'
GROUP BY Yr, Mh having Yr = '2018')
ORDER BY Yr, Mh
執行時會引發以下錯誤:
org.postgresql.util.PSQLException:錯誤:“ conversations.createdatutc”列必須出現在GROUP BY子句中或在聚合函數中使用。
但是,如果我單獨運行它們,它們將正常運行,這里createdatutc是一個時間戳字段
在派生表中進行to_char提取等,並按其結果group by
:
select "Yr", "Mh", count(postid), type
from
(
SELECT
to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh",
postid,
case when type = 'Post' then 'Post' else 'NotPost' end type
FROM conversations
) dt
where "Yr" = 2018
group by "Yr", "Mh", type
從group刪除別名列名稱,如下所示
select * from (
(
Select EXTRACT(Year FROM createdatutc::date) as "Yr",
EXTRACT(MONTH FROM createdatutc::date) as "Mh",
count(postid) as Freq
from conversations
where type = 'Post'
group by
EXTRACT(Year FROM createdatutc::date), EXTRACT(MONTH FROM createdatutc::date)
having EXTRACT(Year FROM createdatutc::date) = 2018)
union
(Select to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh", count(postid) as Freq
from conversations where type <> 'Post'
group by EXTRACT(Year FROM createdatutc::date), EXTRACT(MONTH FROM createdatutc::date)
having EXTRACT(Year FROM createdatutc::date) = 2018)
) as t
order by Yr, Mh
首先:我很驚訝單個查詢的運行。 您不應在HAVING
使用別名列名,因為HAVING
發生在SELECT
之前。
使用UNION
您將刪除重復項。 因此,您算出的月份中,與非職位只有一半的職位數量完全相同。 這是你所追求的嗎? 似乎很奇怪。
無論如何,通過您的查詢,您將獲得多個結果行,並且您將無法分辨出哪些是帖子,哪些是非帖子。
(您可以知道:如果type可以為null,則不會在任何行中進行計數,因為NULL為未知值既不等於也不等於'Post'。)
這是兩種編寫查詢的方式:
SELECT yr, mh, tp, COUNT(*)
FROM
(
SELECT
TO_CHAR(createdatutc, 'YYYY') AS yr,
TO_CHAR(createdatutc, 'MM') AS mh,
CASE WHEN type = 'Post' THEN 'Post' ELSE 'other' END AS tp
FROM conversations
WHERE EXTRACT(YEAR FROM createdatutc) = 2018
) yr2018
GROUP BY yr, mh, tp
ORDER BY yr, mh, tp;
SELECT
yr, mh,
COUNT(CASE WHEN type = 'Post' THEN 1 END) AS count_posts,
COUNT(CASE WHEN type <> 'Post' THEN 1 END) AS count_nonposts
FROM
(
SELECT
TO_CHAR(createdatutc, 'YYYY') AS yr,
TO_CHAR(createdatutc, 'MM') AS mh,
type
FROM conversations
WHERE EXTRACT(YEAR FROM createdatutc) = 2018
) yr2018
GROUP BY yr, mh
ORDER BY yr, mh;
您可以在沒有子查詢(派生表)的情況下執行此操作,但是隨后您將不得不一次又一次地重復相同的表達式。
在@zaynul和@Thorsten的幫助下,我如下修改了查詢
select
yr,
mh,
sum(freq)
from
(
(
Select
to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh",
count(postid) as Freq from conversations where type = 'Post'
group by
to_char(createdatutc,'YYYY'),
to_char(createdatutc,'MM')
having to_char(createdatutc,'YYYY') = '2018'
)
union
(
Select
to_char(createdatutc,'YYYY') as "Yr",
to_char(createdatutc,'MM') as "Mh",
count(postid) as Freq
from conversations where type <> 'Post'
group by
to_char(createdatutc,'YYYY'),
to_char(createdatutc,'MM')
having to_char(createdatutc,'YYYY') = '2018'
)
) as t
group by yr, Mh
order by Yr, Mh
這對我有用了,謝謝大家的幫助和支持在此處輸入代碼
樣本數據:
+ -------+--------------+------+ | postid | createdatutc | type | + -------+--------------+------+ | 1 | 2018-01-01 | Post | | 2 | 2018-01-02 | Nope | | 3 | 2018-01-03 | Njet | | 4 | 2018-01-04 | Nada | | 5 | 2018-02-01 | Post | | 6 | 2018-02-02 | Post | | 7 | 2018-02-03 | Post | | 8 | 2018-02-04 | Nada | | 9 | 2018-03-01 | Post | | 10 | 2018-03-02 | Post | | 11 | 2018-03-03 | Nope | | 12 | 2018-03-04 | Nada | + -------+--------------+------+
結果:
+ -----+----+-----------+ | yr | mh | sum(freq) | + -----+----+-----------+ | 2018 | 01 | 4 | | 2018 | 02 | 4 | | 2018 | 03 | 2 | + -----+----+-----------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.