发现组合差异

时间:2016-05-26 12:24:15

标签: sql sql-server

我真的遇到了一个问题,就是要找出两个columns之间是否存在差异。 Row value如下:

Serial      code
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A1
D03L30225   A2

所以说如果最后有一个像A2这样的条目,有没有办法知道组合序列/代码差异。

我尝试了partitionrank等Windows功能但没有成功

3 个答案:

答案 0 :(得分:1)

这对你有用。有一点需要注意的是,你必须按某种方式订购。也许我订购的东西不适合你的情况,但你需要一些东西。

IF OBJECT_ID('tempdb..#Test', 'U') IS NOT NULL DROP TABLE #Test;

create table #Test
(
    Serial varchar(10),
    code char(2)
)

insert into #Test values ('D03L30225', 'A1')
insert into #Test values ('D03L30225', 'A1')
insert into #Test values ('D03L30225', 'A1')
insert into #Test values ('D03L30225', 'A2')

;
with cte as
(
    select rownum = row_number() over (order by Serial, code), Serial, code
    from #Test
)

select curr.Serial, curr.code,
case
    when curr.code <> prev.code then
        1
    else
        0
end as 'DifferenceFlag'
from cte curr
left join cte prev on prev.rownum = curr.rownum - 1

如果您使用的是SQL Server 2012或更高版本,则可以使用LAG功能。我们仍在使用SQL Server 2008 R2。所以我最近需要做类似的事情,我找到了上面here使用的方法。

答案 1 :(得分:0)

根据您的评论,我假设您要在表格中添加另一列third_column,并根据对Serial,Code的更改

设置此列的值

如果这是真的,你可以使用它:

ALTER TABLE 
    table_name
ADD 
    third_column numeric(18,0);

UPDATE t 
SET t.third_column = t1.rwn
FROM table_name AS t
INNER JOIN 
    (select 
        serial, code
        ,row_number() over (order by serial, code) - 1 as rwn
    from
        table_name 
    group by
        serial, code
    order by 
        serial, code
    ) AS t1 
ON 
    t.serial = t1.serial and t.code = t1.code;

答案 2 :(得分:0)

我可能会编写略有不同的代码。下面的第一个查询将列出具有多个序列号的代码。并且,第二个将标记整组代码,其中包含多个序列号。

提供的其他解决方案将为您提供正确的行号。无论如何,我不知道这是否会有所帮助,但祝你好运!

select 
code,
count(distinct serial) cnt_serial
from table
group by code
having
count(distinct serial) > 1

OR

select 
code,
serial,
case when count(distinct serial) over (partition by code) > 1 then 'Y' end fl_code_has_dup
from table
相关问题