根据所需的数据优先级仅选择一个(NOT TOP)记录

时间:2014-09-04 23:30:46

标签: sql-server tsql

我有一个子查询,它是大型查询的一部分,但实际上我认为这个问题是与子查询隔离的。如果我错了,我会很乐意发布整件事。

我有记录,其中一个人可能有4或5或8或0等条目。我们只想要一条记录但我们有偏好。如果记录A不存在,我们将记录B

最初我加入了桌子

..... .....剪断

LEFT JOIN [COMMUNICATION] Comm ON Peeps.PEOPLE_ID = Comm.PEOPLE_ID

并获得

等结果
  ID      FIRST     LAST        ADDY     BIZ        CELL        FAX         HOME
21930   Person      Name        Addy    3237532500  NULL        NULL        NULL
21930   Person      Name        Addy    NULL        3237910815  NULL        NULL
21930   Person      Name        Addy    NULL        NULL        3235869055  NULL
21930   Person      Name        Addy    NULL        NULL        NULL        3238660704
21930   Person      Name        Addy    NULL        NULL        NULL        NULL

在通讯表中,我确实有5条记录,因此它不是连接问题。

现在我想在这个偏好中只有一行...... 家 细胞 商务 传真

所以我的第一次尝试是使用TOP(1)做一个子查询,但当然只返回表的顶行。我在cte上读到并熟悉它们但在这种情况下我需要能够加入并且不确定你将如何1.获得cte以所需的业务优先级排序记录以及2.如何加入它。 / p>

如果你能指出正确的方向或告诉我要学习什么,我会乐意做自己的工作。

由于

1 个答案:

答案 0 :(得分:0)

没有进一步的信息,这就是我的目标:

create table #temp_table (
    [id] int,
    [first] varchar(50),
    [last] varchar(50),
    [addy] varchar(50),
    [biz] varchar(50) null,
    [cell] varchar(50) null,
    [fax] varchar(50) null,
    [home] varchar(50) null 
)

insert into #temp_table
select 21930, 'Person', 'Name', 'Addy', '3237532500', null, null, null union all
select 21930, 'Person', 'Name', 'Addy', null, '3237910815', null, null union all
select 21930, 'Person', 'Name', 'Addy', null, null, '3235869055', null union all
select 21930, 'Person', 'Name', 'Addy', null, null, null, '3238660704' union all
select 21930, 'Person', 'Name', 'Addy', null, null, null, null


;with ordered as(
    select
        *,
        rn = row_number() over( partition by id 
                                order by 
                                    case
                                        when home is not null then 1
                                        when cell is not null then 2
                                        when biz is not null then 3
                                        when fax is not null then 4
                                        else 9999
                                    end
                               )
    from #temp_table 
)
select 
    [id],
    [first],
    [last],
    [addy],
    [biz],
    [cell],
    [fax],
    [home]
from ordered 
where 
    rn = 1

drop table #temp_table