T-SQL - 重复数据删除大表

时间:2015-07-30 23:50:00

标签: sql-server deduplication

很抱歉,如果已经询问过这个问题。我看到很多类似的问题,但没有一个完全像这个。
我试图去掉一大套(约500 M)记录:

示例数据:

CUST_ID  PROD_TYPE  VALUE  DATE
------------------------------------
1        1          Y      5/1/2015 *
1        2          N      5/1/2015 *
1        1          N      5/2/2015 *
1        2          N      5/2/2015 
1        1          Y      5/3/2015 *
1        2          Y      5/3/2015 *
1        1          Y      5/6/2015 
1        2          N      5/6/2015 *

通过CUST_IDPROD_TYPE,我需要保留初始记录以及任何已更改VALUE的记录(带星号的记录)。 日期之间有时会有差距。大约有5M个独特的CUST_ID

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

Not sure why LAG isn't working for you, this returns your results:

with t as (
     select 1 as CUST_ID, 1 as PROD_TYPE, 'Y' as VALUE, '5/1/2015' as [Date]
    union
    select 1, 2, 'N', '5/1/2015'
    union
    select 1, 1, 'N', '5/2/2015'
    union
    select 1, 2, 'N', '5/2/2015'
    union
    select 1,1, 'Y', '5/3/2015'
    union 
    select 1, 2, 'Y','5/3/2015'
    union
    select 1,1, 'Y', '5/6/2015'
    union
    select 1, 2,'N','5/6/2015')

select 
    *,
    case when 
        value <>
        isnull(lag(value) over (partition by cust_id, prod_type order by [date]),'') 
        then 1 else 0 
    end as keep 
from
    t
order by
    [date],
    cust_id,
    prod_type

答案 1 :(得分:0)

谢谢Kyle,这是完全正确的,我能够将其作为我问题的解决方案。我遇到的问题(不熟悉滞后)是我没有提供默认值,所以日期的差距是创建一个NULL值,这给了我一些问题,但是一旦我提供了它,它就像一个魅力。谢谢!