簡體   English   中英

聯合無法在PostgreSQL中按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM