(免责声明:到目前为止,我对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和其他表来完成更多关系“左连接”,这就是为什么它们需要存储在某个地方。
答案 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。此规则的例外情况很少见。