【问题标题】:Query content of two consecutive quarter查询连续两个季度的内容
【发布时间】:2020-05-19 04:24:26
【问题描述】:

我有一个名为评估的表。它有 4 列:user_id、季度、年份、内容。

我想选择连续两个季度的所有字段(例如:当前季度是 2,所以我想选择 2020 年第 1 季度和 2019 年第 4 季度的所有字段)

这是我的查询:

SELECT e1.user_id, 
e1.quarter AS last_quarter, 
e1.year AS last_year, 
e1.content AS content_last_quarter, 
e2.quarter AS quarter, 
e2.year AS year, 
e2.content AS content_quarter 
FROM evaluations AS e1 JOIN evaluations AS e2 ON e2.user_id = e1.user_id
WHERE (e1.year = 2019) 
    AND (e1.quarter = 4) 
    AND (e2.year = 2020)) 
    AND (e2.quarter = 1) 
    AND e1.deleted_at IS NULL
    AND e2.deleted_at IS NULL

但如果(2020 年第 1 季度)的记录存在,(2019 年第 4 季度)的记录为空,反之亦然,则无结果。我想选择是否存在或两者都存在。谁能帮我?

对不起,我的英语水平不好。

谢谢!

【问题讨论】:

  • 如果您只使用单个时间戳列而不是季度和年份的单独列,您的生活会轻松得多。
  • @TimBiegeleisen 不要改变桌子的设计。

标签: sql postgresql


【解决方案1】:

使用条件聚合:

SELECT e.user_id, 
       MAX(e.quarter) FILTER (WHERE year = 2019) as last_quarter, 
       MAX(e.quarter) FILTER (WHERE year = 2019) as last_year, 
       MAX(e.content) FILTER (WHERE year = 2019) as last_content, 
       MAX(e.quarter) FILTER (WHERE year = 2020) as quarter, 
       MAX(e.quarter) FILTER (WHERE year = 2020) as year, 
       MAX(e.content) FILTER (WHERE year = 2020) as content
FROM evaluations e
WHERE ((e.year = 2019 AND e.quarter = 4) OR
       (e.year = 2020 AND e.quarter = 1) 
      ) AND
      e.deleted_at IS NULL
GROUP BY e.user_id;

【讨论】:

  • 如果content是jsonb类型(content -> 'a' -> 'b'),怎么办?
  • @user11742091 。 . .问一个新问题。这似乎与这个问题无关。
  • 一个,只是(content -> 'a' -> 'b')::text。非常感谢!
猜你喜欢
  • 2017-05-12
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多