是否可以将PostgreSQL(多行)查询结果存储到数组元素中?

时间:2016-02-29 20:53:38

标签: sql arrays postgresql

(免责声明:到目前为止,我对SQL很缺乏经验。)

标题已经说明了。我想将整个表存储为数组元素。所以myarray [1]是桌子,myarray [2]是另一张桌子。这些表具有相同的宽度和属性(列名称),但记录(行)的数量不同。

也许这在PostgreSQL中是不可能的,但应该使用例如Python来访问PostgreSQL数据库。 那么,也许,PosgreSQL数组不能是'table'类型,或者是复合类型?

例如。 我有一个关系(表)至少有两个属性(列)和几个记录(行)。真正的表有几十列和几千行。非常简化:

CREATE TABLE data_orig (category integer, date adate, ...);
INSERT INTO data_orig VALUES (1, 2016-02-28, ...);
INSERT INTO data_orig VALUES (1, 2016-02-29, ...);
-- and so on
INSERT INTO data_orig VALUES (2, 2016-02-28, ...);
INSERT INTO data_orig VALUES (2, 2016-02-29, ...);
INSERT INTO data_orig VALUES (2, 2016-02-27, ...);
--and so on, categories 3 - N

我想要一个数组,其中数组元素是查询的结果。

CREATE TYPE mytype AS (
   category int,
   adate date);

- 关于我想要的数组定义的伪代码:

  

定义myarray mytype [];

我想要一个循环,将原始数据表从最近的日期修剪到最旧的日期。事先我不知道某个类别中的日期有多少。所以我可能最终得到2或10或N个表,因此大小为2,10或N.

-- Make a copy of the original..

CREATE TEMP TABLE data_temp1 AS 
   SELECT category,adate FROM data_orig;

-- LOOP would be start here. 

-- Get the lines with the latest dates.
CREATE TEMP TABLE data_temp2 AS 
  (SELECT category, max(adate) AS adate 
    FROM data_temp1 GROUP BY category);

-- Store the result to array.
**myarray[1] = data_temp2;**
-- 
-- Substract the last result from the working copy.
CREATE TEMP TABLE data_temp3 AS 
  (SELECT * FROM data_temp1 EXCEPT SELECT * FROM data_temp2);

DROP TABLE data_temp1;
-- Copy the working copy to data_temp1:
CREATE TEMP TABLE data_temp1 AS (SELECT * FROM data_temp3);
DROP TABLE data_temp2;
-- Get the next recent dates:
CREATE TEMP TABLE data_temp2 AS 
  (SELECT category, max(adate) AS adate
    FROM data_temp1 GROUP BY category);

-- Now again, I want to store this data_temp2 table to the array: 
**myarray[2] = data_temp2;**
-- And once again subtract the result data_temp2 from the data_temp1
-- and then repeat, until all rows are inserted in the array of tables

这肯定不是最有效的,因为复制BIG表只是为了临时使用,但无论如何最终结果应该是让N表中的最新日期减少。然后使用数组中的这些表,更宽的data_orig和其他表来完成更多关系“左连接”,这就是为什么它们需要存储在某个地方。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

SELECT category, adate, row_number() OVER (PARTITION BY category ORDER BY adate DESC) as rn
FROM data_orig

这将为每一行提供一个数字:" 1"对于类别中的最新行," 2"对于第二个最新的等等。像这样:

1, 2016-02-28, 2, ...
1, 2016-02-29, 1, ...

2, 2016-02-28, 2, ...
2, 2016-02-29, 1, ...
2, 2016-02-27, 3, ...

您可以将此SELECT用作较大SELECT的子查询,以构建它。

BTW不要试图在关系数据库中放置ARRAY内容。大多数情况下,这不是你应该做的事情。数组属于Java和Python等编程语言,而不是SQL。此规则的例外情况很少见。