【问题标题】:SQL Case statement to return index of duplicate rows用于返回重复行索引的 SQL Case 语句
【发布时间】:2017-02-15 04:30:51
【问题描述】:

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

【问题讨论】:

  • 为什么需要用一个在查询时总能确定的值来更新表?您喜欢每次触摸桌子时都必须执行此维护吗?我会将这个计算放在一个视图中,而不是作为表格中的永久列。

标签: sql sql-server


【解决方案1】:

试试这个:

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,但我相信它也应该在这里工作。

【讨论】:

  • 你的意思是partition BY name, Hrs, d order by (select 1),row_number() 需要order by,不是吗?
  • @artm 你是对的,在这种情况下我们可以使用ORDER BY (SELECT 1) 来避免任何排序。在 OP 的情况下,由于存在看起来完全相同的记录,我们不关心 SQL Server 将如何选择内部排序。
  • 感谢大家的回复和帮助,正如您所见,我是论坛的新手,并且正在使用 SQL 变得危险。该表由来自链接服务器的多个表构建而成,我们可能应该有视图,但这是我们更好地与 Power BI 集成的方式。一直在学习!:)
【解决方案2】:

您可以通过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

【讨论】:

  • 最初的问题要求更新,而不是选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多