首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用空值与最大值设计重复数据消除sql语句

使用空值与最大值设计重复数据消除sql语句
EN

Stack Overflow用户
提问于 2016-08-29 12:35:45
回答 2查看 82关注 0票数 0

我正在尝试雕刻一条SQL语句来描述一个表。

该表有三个键:用作业务键的key1、key2、key3。日期也在使用中。

规则是(假设在key1、key2、key3中有匹配):

代码语言:javascript
复制
If all rows have dates, retain only MAX(date)
If one row has a date, and others are NULL, retain only row with date
If all rows has date = NULL, keep all rows.

我一直使用这段代码作为基础:

代码语言:javascript
复制
WITH CTE AS(
   SELECT [key1], [key2], [key3], [date],
       RN = ROW_NUMBER()OVER(PARTITION BY [key1], [key2], [key3], [date] ORDER BY [date] desc)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

我没有受过怎样在sql语句上应用规则的教育。任何智慧都将不胜感激。

重复数据消除示例:

代码语言:javascript
复制
CASE 1: before dedupication:            
key1    key2    key3    date
1   A   1   null
1   A   1   null
1   A   1   null

after deduplication:            
key1    key2    key3    date
1   A   1   null
1   A   1   null
1   A   1   null

CASE 2: before dedupication:            
key1    key2    key3    date
1   A   1   1/1/2016
1   A   1   1/1/2016
1   A   1   1/1/2016

after deduplication:            
key1    key2    key3    date
1   A   1   1/1/2016

CASE 3: before dedupication:            
key1    key2    key3    date
1   A   1   1/1/2016
1   A   1   1/2/2016
1   A   1   1/3/2016

after deduplication:            
key1    key2    key3    date
1   A   1   1/3/2016

CASE 4: before deduplication            
1   A   1   1/1/2016
1   A   1   1/1/2016
1   A   1   null

after deduplication:            
key1    key2    key3    date
1   A   1   1/1/2016


CASE 5: before deduplication            
1   A   1   1/1/2016
1   A   1   1/2/2016
1   A   1   null

after deduplication:            
key1    key2    key3    date
1   A   1   1/2/2016
EN

回答 2

Stack Overflow用户

发布于 2016-08-29 14:43:06

我相信,您就快成功了,只是需要一个位置来排除满足规则#3的行,使其不被删除。

代码语言:javascript
复制
 ;WITH CTE AS(
        SELECT [key1], [key2], [key3], [date],
           RN = ROW_NUMBER()OVER(PARTITION BY [key1], [key2], [key3] ORDER BY isnull([date], '19000101' desc)
        FROM dbo.Table1 t1
        WHERE EXISTS ( SELECT * 
                       FROM dbo.Table1 t2 
                       WHERE t1.key1=t2.key1 
                         and t1.key2=t2.key2 
                         and t1.key3=t2.key3 
                         and t1.[date] IS NOT NULL
                     )
    )
    DELETE FROM CTE WHERE RN > 1
票数 0
EN

Stack Overflow用户

发布于 2016-08-29 15:06:42

代码语言:javascript
复制
WITH CTE AS(
   SELECT [key1], [key2], [key3], [date],
       RN = ROW_NUMBER() OVER (PARTITION BY [key1], [key2], [key3] ORDER BY [date] desc),
       mxD = max([date]) OVER (PARTITION BY [key1], [key2], [key3])
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1 and mxD is not null
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39198554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档