选择联合计数和组,多个表,PostgreSQL

时间:2018-07-30 13:53:02

标签: sql postgresql

您好,我有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"

我该如何解决?谢谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

这是一些演示此想法的示例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"

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

答案 2 :(得分:0)

也许我已经通过这种方式解决了:

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"

答案 3 :(得分:0)

fun linspace(start: Int, stop: Int, num: Int) = Array(num) { start + it * ((stop - start) / (num - 1)) }