如何将包含现有行和新行的新列添加到表中?

时间:2015-07-02 06:16:49

标签: sql join netezza

我有一张表,我用一个唯一的密钥创建,另一列代表2014年12月的一天(例如,2014年12月26日的数据名为D20141226)。因此该表包含32列(键+ 31天)。这些每日列表示客户在该特定日期进行了交易,或者没有任何交易由0表示。

现在我想每天执行相同的查询,生成在特定日期有交易的唯一键列表。我使用了这个简单的脚本:

CREATE TABLE C01012015 AS
SELECT DISTINCT CALLING_ISDN AS A_PARTY
FROM CDRICC_012015
WHERE CALL_STA_TIME ::date = '2015-01-01'

现在我的问题是,如何在31天内将新日常表的内容添加到现有表中,使其成为一个包含32天数据的表(然后每天继续这样做存储长达360天的数据)?

请注意,新客户每天都在进行交易,因此每日表格中的唯一键会在前一天的大表格中不存在。

如果这些新行自动获得0而不是NULL,那将是理想的,但如果它获得NULL值,我可以解决它(不知道如何确保它获得0)。

我认为FULL OUTER JOIN将是解决方案,但这意味着我必须列出select语句中的所有变量,这变得非常大,因为我每天添加一个列。有更优雅的方式吗?

或者SQL是不适合这种情况而且像R这样的编程语言会更好吗?

1 个答案:

答案 0 :(得分:0)

如果您可以选择完全更改架构,则应取消对表格的忽略,以使列类似CUSTOMER_ID INTEGER, D DATE, DID_TRANSACTION BOOLEAN。有post on the Enzee Community website建议使用用户定义的表函数(UDTF)来执行此操作。如果以这种方式更改架构,一个简单的插入就可以正常工作,并且不需要动态添加列。

如果您无法更改模式,但仍然可以添加列,则可以预先为一年中的每一天添加一列,默认值为FALSE (假设它是一个布尔列,表示客户当天是否有交易)。你可能想要编写这个脚本。

ALTER TABLE table_with_daily_columns MODIFY COLUMN (D20140101 BOOLEAN DEFAULT FALSE);
ALTER TABLE table_with_daily_columns MODIFY COLUMN (D20140102 BOOLEAN DEFAULT FALSE);
-- etc
ALTER TABLE table_with_daily_columns ADD COLUMN (D20150101 BOOLEAN DEFAULT FALSE);

GROOM TABLE table_with_daily_columns;

当您更改这样的表时,Netezza会创建一个新表和一个内部视图,用于执行新表和旧表的UNION。您需要GROOM表将表合并为一个表以提高性能。

如果您确实必须每天保留一列,那么您必须使用您描述的方法来转移每日交易表中的数据。如上所述,将每个列的默认值设置为0FALSE,然后:

INSERT INTO table_with_daily_columns 
    SELECT
        cust_id,
        TRUE as D20150101
    FROM C01012015;