【问题标题】:Postgres - Taking Greatest of columns created from JSONPostgres - 采用 JSON 创建的最伟大的列
【发布时间】:2020-03-21 06:46:28
【问题描述】:

我在 Postgres 数据库中有一个 JSON 列,其中包含星期几的键和该日期的访问值。我想获取最大天数并将其添加为一周中所有天的值旁边的列。

我有以下我认为可以做到的查询。但我目前收到错误“列'星期一'不存在”

我从 JSON 中提取星期一后,为什么不存在星期一?内部查询工作正常,并按我的预期返回所有日期和相应的值(星期一、星期二、星期三、星期四、星期五的列)。我认为查询这些列并获得最大的列会相对容易。

SELECT Monday, Tuesday, Wednesday, Thursday, Friday,
GREATEST(Monday, Tuesday, Wednesday, Thursday, Friday) as MaxDay
FROM "VisitData"
WHERE
    (SELECT 
        popularity_by_day ->> 'Monday' AS Monday,
        popularity_by_day ->> 'Tuesday' AS Tuesday,
        popularity_by_day ->> 'Wednesday' AS Wednesday,
        popularity_by_day ->> 'Thursday' AS Thursday,
        popularity_by_day ->> 'Friday' AS Friday
    FROM "VisitData")

更新:

我现在在别名子查询之后有这个查询:

    SELECT Monday, Tuesday, Wednesday, Thursday, Friday,
    GREATEST(Monday, Tuesday, Wednesday, Thursday, Friday) as MaxDay
    FROM
        (SELECT 
            popularity_by_day ->> 'Monday' AS Monday,
            popularity_by_day ->> 'Tuesday' AS Tuesday,
            popularity_by_day ->> 'Wednesday' AS Wednesday,
            popularity_by_day ->> 'Thursday' AS Thursday,
            popularity_by_day ->> 'Friday' AS Friday
    FROM "VisitData") AS visits
    ```

This gives me the structure of the output im expecting but the results are inconsistent.

For example row 1 in the result
Monday = 5
Tuesday = 89
Wednesday = 95
Thursday = 120
Friday = 102
MaxDay = 95  (why not 120)

And for row 2
Monday = 329
Tuesday = 350
Wednesday = 439
Thursday = 397
Friday = 314
MaxDay = 439 (This is correct)

【问题讨论】:

  • 我认为您需要删除部分"VisitData" WHERE,然后为子查询设置别名。
  • WHERE 需要布尔表达式而不是子查询
  • 嗨 - 请各位详细说明一下?似乎它们是相反的建议?还是有两种方法可以达到相同的目的?我认为子查询是一种干净的方法 - 但也许我错过了一些东西。非常感谢。

标签: sql postgresql


【解决方案1】:

我想你想要一个横向连接:

SELECT v.Monday, v.Tuesday, v.Wednesday, v.Thursday, v.Friday,
       GREATEST(v.Monday, v.Tuesday, v.Wednesday, v.Thursday, v.Friday) as MaxDay
FROM "VisitData" vd CROSS JOIN LATERAL
     (SELECT vd.popularity_by_day ->> 'Monday' AS Monday,
             vd.popularity_by_day ->> 'Tuesday' AS Tuesday,
             vd.popularity_by_day ->> 'Wednesday' AS Wednesday,
             vd.popularity_by_day ->> 'Thursday' AS Thursday,
             vd.popularity_by_day ->> 'Friday' AS Friday
     ) v;

【讨论】:

  • 感谢您 - 我现在收到一个新错误。错误:“AS”第 4 行或附近的语法错误:(VALUES (vd.popularity_by_day ->> 'Monday' AS Monday,你能详细说明这种方法在做什么吗?
  • @matthewmturner 。 . .那应该是SELECT 而不是VALUES,所以别名是内联的。
  • 谢谢 - 生成结果。但是,我仍然遇到了我在更新中提出的相同问题(现在可能超出了我最初问题的范围)。但是最大的并不是始终返回 5 列中最大的。有时会,有时不会。我的更新中的示例。您认为这与联接/子查询有关还是我如何使用最大?
  • @matthewmturner 。 .如果我不得不猜测,那是因为该值是字符串。您可能只需要将它们转换为数字。
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 2013-12-16
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2020-06-10
相关资源
最近更新 更多