【问题标题】:select union count and group, multiple tables, postgresql选择联合计数和组、多个表、postgresql
【发布时间】:2019-04-22 04:59:23
【问题描述】:

您好,有 12 个表,我想为所有表中的某些字段获取唯一值。 通过运行以下查询(我在 2 个表之间进行了测试),我得到了一个可接受的结果,但是如果两个表中都存储了唯一值,则会重复计数:

SELECT "mmsi", "type", "l", "w", "flag", COUNT (*) FROM test_1 GROUP BY "mmsi", "type", "l", "w", "flag"
UNION
SELECT "mmsi", "type", "l", "w", "flag", COUNT (*) FROM test_2 GROUP BY "mmsi", "type", "l", "w", "flag"

我该如何解决?谢谢

【问题讨论】:

  • 能否提供一些示例数据并期待结果?

标签: sql postgresql


【解决方案1】:

通过聚合每个表,您会得到如下结果:

mmsi type l w flag count(*) 123 456 A B C 12 123 456 A B C 25 234 567 X Y Z 17 234 567 X Y Z 11

因为UNION 没有检测到任何重复项,因为计数不同。如果有两行具有相同的计数,则会删除其中的一行,因此计数会太小 50%。

你可能想要这个:

mmsi type l w flag count(*) 123 456 A B C 37 234 567 X Y Z 28

而不是总计数,无论在哪个表中。所以首先获取一组所有记录(使用UNION ALL),然后聚合。

SELECT mmsi, type, l, w, flag, COUNT (*)
FROM
(
  SELECT mmsi, type, l, w, flag FROM test_1 
  UNION ALL
  SELECT mmsi, type, l, w, flag FROM test_2
) all_records
GROUP BY mmsi, type, l, w, flag

【讨论】:

    【解决方案2】:

    我会尝试从您的原始查询中创建一个嵌入式查询,然后按原始字段(不包括计数字段)进行分组,并对外部查询中的计数求和。

    这是一些演示该想法的示例 SQL:

    select "mmsi", "type", "l", "w", "flag", SUM(c) from
    (SELECT "mmsi", "type", "l", "w", "flag", COUNT (*) as c FROM test_1 GROUP BY "mmsi", "type", "l", "w", "flag"
    UNION
    SELECT "mmsi", "type", "l", "w", "flag", COUNT (*) as c FROM test_2 GROUP BY "mmsi", "type", "l", "w", "flag") q 
    group by "mmsi", "type", "l", "w", "flag"
    

    您必须检查语法是否正确,但这应该足以让您有所了解。

    【讨论】:

      【解决方案3】:

      也许我是这样解决的:

      SELECT "mmsi", "type", "l", "w", "flag" , COUNT (*)
      FROM (SELECT "mmsi", "type", "l", "w", "flag" FROM test_1
      UNION ALL
      SELECT "mmsi", "type", "l", "w", "flag" FROM test_2) As test
      GROUP BY "mmsi", "type", "l", "w", "flag"
      

      【讨论】:

        【解决方案4】:
        SELECT 
          (select count(*) from table1 where ID = '123')
          + (select count(*) from table2 where ID = '456')
          + (select count(*) from table3 where ID = '789')
        

        【讨论】:

        • 添加一些解释是个好主意,这样用户可以更容易地使用您的答案。仅代码的答案有时不能满足用户的目的,而且难以理解-评论
        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多