SQL: 删除具有不同名称的相同列

SQL: Deleting Identical Columns With Different Names

我正在使用 Netezza SQL。我原来的 table ("original_table") 看起来像这样(包含数字和字符变量):

  age height height2 gender gender2
1  18   76.1    76.1      M       M
2  19   77.0    77.0      F       F
3  20   78.1    78.1      M       M
4  21   78.2    78.2      M       M
5  22   78.8    78.8      F       F
6  23   79.7    79.7      F       F

我想从此 table 中删除具有相同条目但名称不同的列。最后,这应该是这样的 ("new_table"):

  age height gender
1  18   76.1      M
2  19   77.0      F
3  20   78.1      M
4  21   78.2      M
5  22   78.8      F
6  23   79.7      F

我的问题: SQL 中是否有标准方法可以做到这一点?我尝试做一些研究并发现了以下 link :How do I compare two columns for equality in SQL Server?

到目前为止我尝试了什么: 看起来像这样的东西可能会起作用:

CREATE TABLE new_table AS SELECT * FROM original_table;

ALTER TABLE new_table
ADD does_age_equal_height varchar(255);

    UPDATE new_table 

SET     does_age_equal_height =  CASE  
WHEN age = height THEN '1' ELSE '0' END AS does_age_equal_height;
                  

从这里开始,如果“does_age_equal_height”列中所有值的“总和”等于“new_table”中的行数(即 select count(rownum) from new_table)- 这必须意味着两列相等,并且可以删除其中一列。

但是,这是一种非常低效的方法,即使对于具有少量列的 tables 也是如此。在我的示例中,我有 5 列 - 这意味着我必须重复上述过程“5C2”次,即 5 次! / (2!*3!) = 10 次。例如:

ALTER TABLE employees
  ADD does_age_equal_height varchar(255),
     does_age_equal_height2 varchar(255)
does_age_equal_gender varchar(255)
does_age_equal_gender2 varchar(255)
does_height_equal_height2 varchar(255)
does_height_equal_gender varchar(255)
does_height_equal_gender2 varchar(255)
does_height2_equal_gender varchar(255)
does_height2_equal_gender2 varchar(255)
does_gender_equal_gender2 varchar(255);

随后会出现多个 CASE 语句 - 使过程进一步复杂化。

有人可以告诉我更有效的方法吗?

谢谢!

我希望以正确的方式解决你的问题。这是我在SqlServer中的代码来处理它,你应该根据Netezza自定义它SQL。

我的想法是:
计算每一列的MD5,然后将这些列放在一起进行比较,如果哈希值相同,则选择其中一列。

我要为这个问题创建以下 table:

CREATE TABLE Students
(
    Id INT PRIMARY KEY IDENTITY,
    StudentName VARCHAR (50),
    Course VARCHAR (50),
    Score INT,
    lastName VARCHAR (50) -- another alias for StudentName ,
    metric INT, -- another alias for score
    className VARCHAR(50) -- another alias for Course 
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95, 'Sally', 95, 'English');
INSERT INTO Students VALUES ('Sally', 'History', 82, 'Sally', 82, 'History');
INSERT INTO Students VALUES ('Edward', 'English', 45, 'Edward', 45, 'English');
INSERT INTO Students VALUES ('Edward', 'History', 78, 'Edward', 78, 'History');

创建 table 并插入示例记录后,它会转而查找相似的列。

步骤 1. 声明变量。

DECLARE @cols_q VARCHAR(max), 
        @cols VARCHAR(max), 
        @table_name  VARCHAR(max)= N'Students', 
        @res  NVARCHAR(max),
        @newCols VARCHAR(max),
        @finalResQuery VARCHAR(max);

第 2 步。生成动态查询以计算每列的哈希值。

SELECT @cols_q = COALESCE(@cols_q+ ', ','')+'HASHBYTES(''MD5'',  CONVERT(varbinary(max), (select '+ COLumn_NAME +' as t  from Students FOR XML AUTO))) as '+ COLumn_NAME,
        @cols = coalesce(@cols + ',','')+COLumn_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name; 
 set  @cols_q = 'select '+  @cols_q +' into ##tmp_'+ @table_name+' from '+ @table_name;

第 3 步。运行 生成查询。

 exec(@cols_q)

第 4 步。获取删除了重复列的列。

  set @res = N'select  uniq_colname into ##temp_colnames
  from(
  select  max(colname) as uniq_colname from (
     select * from ##tmp_Students 
 )tt
 unpivot ( 
    md5_hash for colname in ( '+ @cols +')
 ) as tbl
 group by md5_hash
 )tr';
   exec ( @res);

第 5 步。获得最终结果

select @newCols  = COALESCE(@newCols+ ', ','')+ uniq_colname from ##temp_colnames

 set @finalResQuery = 'select '+ @newCols +' from '+ @table_name;
 exec (@finalResQuery)