PostgreSQL - 如何分别在两列上区分?

时间:2014-03-01 10:04:16

标签: postgresql unique distinct multiple-columns

我有一张这样的桌子:

Source table "tab"
column1   column2
      x         1
      x         2
      y         1
      y         2
      y         3
      z         3

如何构建查询以分别在两列中的每一列中获取具有唯一值的结果。例如,我想得到一个像这些集合之一的结果:

column1   column2
      x         1
      y         2
      z         3

column1   column2
      x         2
      y         1
      z         3

或......

感谢。

1 个答案:

答案 0 :(得分:0)

你要求的是困难的,因为它很奇怪:SQL将行视为相关字段,但你要求创建两个单独的列表(col1中的不同值和col2中的不同值)然后将它们显示在一个输出表中而不是关心行如何匹配。

您可以通过沿着这些行编写SQL来实现此目的。为每列写一个单独的选择distinct,然后以某种方式将它们放在一起。我将它们放在一起,给每个结果中的每一行添加一个行号,然后将它们连接到一个大的数字列表中。

目前还不清楚你想要null是什么意思。这是否意味着其中一列中存在空值,或者每列中的不同值的数量是否相同?这个问题来自于要求与典型的关系逻辑不匹配的事情。

这是一个示例,从数据中删除null值,因为这会混淆问题,不同的数据值可以避免将rowNumber与数据混淆,因此一列中有3个不同的值,另一列中有4个不同的值。这适用于SQL Server,可能是PostgreSQL的变种。

if object_id('mytable') is not null drop table mytable;
create table mytable ( col1 nvarchar(10) null, col2 nvarchar(10) null) 
insert into mytable 
            select 'x', 'a'
union all   select 'x', 'b'
union all   select 'y', 'c'
union all   select 'y', 'b'
union all   select 'y', 'd'
union all   select 'z', 'a'

select c1.col1, c2.col2
from 
    -- derived table giving distinct values of col1 and a rownumber column
(   select col1
        , row_number() over (order by col1) as rowNumber 
    from ( select distinct col1 from mytable ) x ) as c1
full outer join 
    -- derived table giving distinct values of col2 and a rownumber column
(   select col2
        , row_number() over (order by col2) as rowNumber 
    from ( select distinct col2 from mytable ) x ) as c2
on c1.rowNumber = c2.rowNumber