我正在运行查询以从多个表中返回多行员工小时数据。 员工有一个有效的条件,即每天8小时的班次为多个客户进行计费。 我想更新"索引"具有唯一索引的列,用于跨3列的任何重复
eg.
Emp Hrs Date Index
Fred 8 11/7 1
Fred 8 11/7 2
Fred 8 11/7 3
Fred 10 12/7 1
Fred 9 13/7 1
在Select语句中,这是一个Case语句,它在Index列中返回一个重复的值,但它没有给出唯一值
case when count(*) over (partition by Emp, Hrs, Date) > 1
then 1
else 0
end
我可以在case语句中按条件包含一组来实现这个目的吗?
答案 0 :(得分:4)
试试这个:
UPDATE x
SET x.Index = x.Index_Calc
FROM
(
SELECT Index, ROW_NUMBER() OVER (PARTITION BY Emp, Hrs, Date ORDER BY (SELECT 1)) AS Index_Calc
FROM yourTable
) x
我的答案是this Stack Overflow question,但我相信它也可以在这里工作。
答案 1 :(得分:1)
您可以使用row_number()
和partition by
来实现这一目标。
分区将为您提供一个行号,每次遇到新的“值”组时,该行号都会重置。
create table billings (employee varchar(100), hours decimal(10,2), billed_on date)
go
insert into billings values
('Mike', 8, '2017-02-01'),
('Mike', 8, '2017-02-01'),
('Mike', 8, '2017-02-01'),
('Mike', 8, '2017-02-19'),
('John', 10, '2017-02-01'),
('John', 8, '2017-02-01');
select employee, hours, billed_on,
row_number() over (partition by employee, billed_on order by employee) as ix
from billings
order by billed_on, employee, ix
产地:
employee hours billed_on ix
1 John 10,00 01.02.2017 1
2 John 8,00 01.02.2017 2
3 Mike 8,00 01.02.2017 1
4 Mike 8,00 01.02.2017 2
5 Mike 8,00 01.02.2017 3
6 Mike 8,00 19.02.2017 1