至关重要-将查询循环转换为1个有趣且合并的查询

时间:2018-08-14 22:29:30

标签: python sql postgresql

我正在尝试将我的简单查询优化为更复杂的查询。

我有三个桌子

Table 1
a_id  info
1     talk
2     talk
3     sleep
4     sit

Table 2 
key data_1 data_2 a_id g_id dat_3
1     6.4  3.2    1    1    a
2     5.6  3.5    1    2    a
3     4.6  6.7    1    3    b
4     1.2  2.3    2    4    c
5     0.9  5.6    3    5    c
6     1.1  1.5    4    6    b

Table 3
g_id dat_1 dat_2
1     x     t
2     x     b
3     y     o
4     y     t

Psuedo code 

#get a_ids from table 1 
for each a_id:
   extract unique g_id from table 2
   for each g_id:
       count number of a,b,and c using union from 

我已经使用循环和简单查询实现了上述psuedo代码(在postgresql中)。如您所见,我必须运行太多查询。这极大地减慢了该过程。我该如何仅使用1个大查询来完成此操作-快得多?

示例-循环跑步以进行交谈,睡眠和坐下。

可以说-
a_ids将为1,2。

对于1,它将找到1,2,3作为g_id。

对于每个g_id,它将计算a,b和c的数量。     数到最后。

必填输出为:

info  a_id g_id  a  b  c 

talk  2     3    2  1  1
sleep 1     1    0  0  1  
sit   1     1    0  1  0

我是Postgresql数据库的新手,正在进入复杂的查询。请在这里帮助我。如果您不喜欢这个问题,请告诉我,我们将删除它。不要投票。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试使用条件汇总函数

JOIN
CREATE TABLE Table1(
   a_id INT,
   info VARCHAR(5)
);

INSERT INTO Table1 values (1,'talk');
INSERT INTO Table1 values (2,'talk');
INSERT INTO Table1 values (3,'sleep');
INSERT INTO Table1 values (4,'sit');


CREATE TABLE Table2(
  a_id INT,
  g_id INT,
  dat_3 VARCHAR(5)
);




INSERT INTO Table2 values (1,1,'a');
INSERT INTO Table2 values (1,2,'a');
INSERT INTO Table2 values (1,3,'b');
INSERT INTO Table2 values (2,4,'c');
INSERT INTO Table2 values (3,5,'c');
INSERT INTO Table2 values (4,6,'b');

查询1

SELECT t1.info,
       COUNT(DISTINCT t1.a_id) a_id,
       COUNT(DISTINCT t2.dat_3) g_id,
       sum((dat_3 = 'a')::int) a,
       sum((dat_3 = 'b')::int) b,
       sum((dat_3 = 'c')::int) c
FROM Table1 t1 
INNER JOIN Table2 t2 on t1.a_id = t2.a_id
group by t1.info
order by t1.info desc

Results

|  info | a_id | g_id | a | b | c |
|-------|------|------|---|---|---|
|  talk |    2 |    3 | 2 | 1 | 1 |
| sleep |    1 |    1 | 0 | 0 | 1 |
|   sit |    1 |    1 | 0 | 1 | 0 |

注意

  1. sum((dat_3 = 'a')::int)可以使用bool将sum转换为int,如果条件为true则使用1,否则使用0
  2. sum条件取决于dat_3列。您可以在逻辑中动态添加条件。