如何将包含现有行和新行的新列添加到表中?
Posted
技术标签:
【中文标题】如何将包含现有行和新行的新列添加到表中?【英文标题】:How to add a new column with existing and new rows to a table? 【发布时间】:2015-07-02 06:16:48 【问题描述】:我有一个表,我使用唯一键创建了一个表,并且每列代表 2014 年 12 月的某一天(例如,命名为 D20141226 的数据来自 2014 年 12 月 26 日)。所以该表由 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 这样的编程语言在这方面会更好?
【问题讨论】:
您使用的是哪个 dbms? (您可能需要特定于产品的功能。) 我正在使用 Netezza @jarlh 好的,我读了大约 4 次,但仍然不明白你在追求什么。你能举一些例子和一些数据吗? 【参考方案1】:如果您可以选择完全更改架构,则应取消透视表,以便您的列类似于 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
表以将表合并为一个以提高性能。
如果您确实必须每天保留一列,那么您将不得不使用您描述的方法从每日交易表中透视数据。如上所述,将每个列的默认值设置为 0
或 FALSE
,然后:
INSERT INTO table_with_daily_columns
SELECT
cust_id,
TRUE as D20150101
FROM C01012015;
【讨论】:
以上是关于如何将包含现有行和新行的新列添加到表中?的主要内容,如果未能解决你的问题,请参考以下文章