PostgreSQL / plpython:如何比较循环中不同表的两列

时间:2013-12-09 22:09:24

标签: sql postgresql

我遇到循环问题,我必须比较不同表之间的列。

我有两张表year2004year2005。两者都包含月份数和该月的金额。我想比较两个表中的金额,并生成第三个表year,其中包含该月的月数和最大金额。

例如我在2004年 - 100,在2005年 - 200所以我必须返回值(2005,number_of_month,200)。你有什么想法来解决这个问题吗?

PS。对不起我的写作错误,我几年前才学会英语:)

1 个答案:

答案 0 :(得分:1)

猜测你想要在两年内找到每个月最高金额

如果您的数据全部放在一个monthly_statisticsdate列中,那么这将会轻松得多。然后它只是一个简单的聚合函数或窗口。

所以让我们将两个表合为一个。

给出样本数据:

CREATE TABLE year2004 ( month int primary key, amount int);
INSERT INTO year2004 (month, amount)
VALUES (1, 50), (2, 40), (3, 60), (4, 80), (5, 100), (6, 800), (7, 20), (8, 40), (9, 30), (10, 40), (11, 50), (12, 99);

CREATE TABLE year2005 ( month int primary key, amount int);
INSERT INTO year2005 (month, amount)
VALUES (1, 88), (2, 44), (3, 11), (4, 123), (5, 12), (6, 88), (7, 21), (8, 19), (9, 44), (10, 89), (11, 4), (12, 42);

我们可以加入表格,也可以按日期将其转换为单个表格,然后对其进行过滤。以下是我们如何使用内容生成单个表:

SELECT DATE '2004-01-01' + month * INTERVAL '1' MONTH AS sampledate, amount
FROM year2004
UNION ALL
SELECT DATE '2005-01-01' + month * INTERVAL '1' MONTH, amount
FROM year2005;

如果您打算创建一个新表,那就是您要使用的内容,但如果您不关心实际日期,只关注几个月,您可以简单地将两个表联合起来:

WITH samples AS (
  SELECT month, amount
  FROM year2004
  UNION ALL
  SELECT month, amount 
  FROM year2005
)
SELECT month, max(amount) AS amount 
FROM samples 
GROUP BY 1
ORDER BY month;

 samplemonth | amount 
-------------+--------
           5 |    123
          11 |     89
           1 |     99
           2 |     88
           3 |     44
           9 |     40
           4 |     60
           6 |    100
          10 |     44
          12 |     50
           7 |    800
           8 |     21
(12 rows)