【问题标题】:postgresql combine 2 select from 2 different tablespostgresql 结合 2 从 2 个不同的表中选择
【发布时间】:2022-01-17 01:57:08
【问题描述】:

您好,我需要使用 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

但不起作用,感谢您的提醒并帮助我调试此问题

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    第二个子查询无效,因为 digitcurrrency 需要是 group by 列表的一部分(除非“名称”是主键)。无论如何distinct on ("Name") 会为每个名字提取一条记录,我想这是你需要的;您可以通过添加带有以“名称”开头的表达式列表的order by 子句来控制为每个名称选择哪条记录。
    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;
    

    【讨论】:

    • 谢谢,这段代码效果很好,但是,现在如果我在我的数据库上运行它,例如,“name: #AAA”每天有 150 条不同的记录,我得到所有 150 条记录平均价格,不是我想要的,1 roq 与 150 条记录的平均值,就像我在原始帖子中绘制的最后一张表一样。
    • 好吧,如果您按姓名和日期分组,则姓名和日期的组合应该只有一行。如果您想要每个名称一行而不考虑日期,请从选择和分组列表中删除“时间”。
    • 是的,谢谢,我修复了按“name”、date_trunc('day', "Time") 添加组并正确获取平均值
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多