SQL Case语句返回重复行的索引

时间:2017-02-15 04:30:51

标签: sql sql-server

我正在运行查询以从多个表中返回多行员工小时数据。 员工有一个有效的条件,即每天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语句中按条件包含一组来实现这个目的吗?

2 个答案:

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