分区中排序的派生列
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
使用 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