使用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
答案 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