在分区

时间:2016-05-27 14:24:32

标签: tsql sql-order-by case partition

使用Sql Server 2008 R2。

如果有超过1行类型的人口统计学变化,我需要删除除了每人1之外的所有人,但是人口统计学变化的类型是加权的,其中一些比其他人更重要。我不知道数据会保留什么,但如果特定联系人存在更重要的数据,我希望它能够升到最高位置。

我试过了:

;WITH cte AS
(
    SELECT lastname, firstname, FieldChanged,
     Case 'FieldChanged'
     When 'firstname' then 0
     When 'lastname' then 0
     When 'ssn' then 1
     When 'xyz' then 5
       End as "Weight"
     , ROW_NUMBER() OVER (PARTITION BY D2.ContactId, D2.ContractId ORDER BY weight asc) AS demorow
    FROM MyDATA d2
    where d2.FieldChanged in ('firstname', 'lastname', 'ssn', 'xyz')
)
SELECT *
FROM cte 
WHERE demorow > 1

这给我一个错误:列名称无效'权重'。 我想我不能使用APPLY,因为源表中没有唯一的密钥,这不在我的控制之下。

更新

CREATE TABLE dbo.MyTempTable

(firstname varchar(25)NOT NULL,     lastname varchar(25)NOT NULL,     FieldChanged varchar(25),     ContactId uniqueidentifier,     ContractId uniqueidentifier   ) 走 插入dbo.mytemptable (名字 ,     姓 ,     FieldChanged,     ContactId,     ContractId)     值     (' john',' smith',' ssn',' 688CB150-C7FD-E511-8709-00155D070201',' 688CB150 -C7FD-E511-8709-00155D070202')    ,' john',' smith',' xyz',' 688CB150-C7FD-E511-8709-00155D070201',' 688CB150-C7FD-E511-8709-00155D070202')    ,' mary',' doe' xyz',' 688CB150-C7FD-E511-8709-00155D070203',' 688CB150-C7FD-E511-8709-00155D070202')    ,' mary',' doe',' firstname',' 688CB150-C7FD-E511-8709-00155D070203',' 688CB150-C7FD-E511-8709-00155D070202')    ,' mary',' doe',' lastname',' 688CB150-C7FD-E511-8709-00155D070203',' 688CB150-C7FD-E511-8709-00155D070202')    ,' mary',' do'' ssn',' 688CB150-C7FD-E511-8709-00155D070203',' 688CB150-C7FD-E511-8709-00155D070202&#39)

对于这些数据,我希望选择John Smith's和Mary Doe各自的xyz行,因为它们的名称更改行不太重要。

更新2:

我认为这有效:

;WITH cte AS

(     SELECT lastname,firstname,FieldChanged,      Case FieldChanged          当' firstname'那么0          当'姓氏'那么0          什么时候' ssn'然后5          什么时候' xyz'然后1          否则9      结束为"重量",     ContractId,ContractID     来自edi..MyDATA d2     其中d2.FieldChanged in(' firstname',' lastname',' ce_ssn',' Policy Number') ) cte2 As (     选择 *      ,ROW_NUMBER()OVER(由ContactId分类,ContractId ORDER BY weight asc)AS demorow     来自cte ) 选择 * 来自cte2 在哪里展开> 1

2 个答案:

答案 0 :(得分:1)

替换"体重"在完整的CASE声明的顺序。或者将主查询(没有order by)放在子查询中,将行号放在外部查询中。那么你应该能够获得"体重"列按顺序排列。

答案 1 :(得分:1)

在执行SELECT表达式的所有其他子句之后分配列别名(除了ORDER BY 子句,但不是 ORDER BY 表达式),所以你不能在同一个SELECT表达式中使用它们,只能在它们之外(或在ORDER BY 子句中)。

这是一个快速修复:

;WITH cte AS
(
    SELECT lastname, firstname, FieldChanged,
     Case FieldChanged
     When 'firstname' then 0
     When 'lastname' then 0
     When 'ssn' then 1
     When 'xyz' then 5
       End as "Weight",
    ContactId, ContractID
    FROM MyDATA d2
    where d2.FieldChanged in ('firstname', 'lastname', 'ssn', 'xyz')
),
cte2 As
(
    SELECT *
     , ROW_NUMBER() OVER (PARTITION BY ContactId, ContractId ORDER BY weight asc) AS demorow
    FROM cte
)
SELECT *
FROM cte2
WHERE demorow > 1