分区中排序的派生列

derived column in Order by in 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

这给了我一个错误:无效的列名 'weight'。 我想我不能使用 APPLY,因为源 table 中没有唯一键,这不在我的控制之下。

更新:

CREATE TABLE dbo.MyTempTable

(名字 varchar(25) NOT NULL, 姓氏 varchar(25) 不为空, FieldChanged varchar(25), ContactId 唯一标识符, ContractId 唯一标识符 ) 走 插入 dbo.mytemptable (名 , 姓 , 字段已更改, 联系方式 , 合约编号) 价值观 ('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', 'doe', 'ssn', '688CB150-C7FD-E511-8709-00155D070203', '688CB150-C7FD-E511-8709-00155D070202')

对于此数据,我希望选择 John Smith 和 Mary Doe 各自的 xyz 行,因为不如他们的名称更改行重要。

更新 2:

我认为这可行:

;WITH cte AS

( SELECT 姓氏,名字,FieldChanged, 个案字段已更改 当 'firstname' 则 0 当 'lastname' 则 0 当 'ssn' 那么 5 当 'xyz' 然后 1 其他 9 结束为 "Weight", 联系人 ID、合同 ID 从编辑..MyDATA d2 其中 d2.FieldChanged 在 ('firstname', 'lastname', 'ce_ssn', 'Policy Number') ), cte2作为 ( SELECT * , ROW_NUMBER() OVER (PARTITION BY ContactId, ContractId ORDER BY weight asc) AS derow 从 cte ) SELECT * 来自 cte2 WHERE demorow > 1

将顺序中的 "weight" 替换为完整的 CASE 语句。或者将主查询(没有排序依据)放在子查询中,将行号放在外部查询中。然后您应该能够按顺序访问 "weight" 列。

列别名是在 SELECT 表达式的所有其他子句执行后分配的(除了 ORDER BY 子句 ,但 不是 ORDER BY expressions), 所以你不能在同一个 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