Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消除SQL中的重复记录_Sql_Sql Server - Fatal编程技术网

消除SQL中的重复记录

消除SQL中的重复记录,sql,sql-server,Sql,Sql Server,我有一个名为attribute\u value的表,其中包含以下列 attribute_id | start_date | value | latest_ind | mod_dtime latest_ind列的值可以是1或0 我基本上想在这个表上运行一个更新脚本,它查找所有属性,这些属性的公共开始日期和最新索引都等于一,并将最新索引设置为零,除非记录是最新的 我已经成功地组合了下面的SELECT查询,但我不知道如何将其转换为更新。任何指点都将不胜感激 SELECT av.attribute_i

我有一个名为
attribute\u value
的表,其中包含以下列

attribute_id | start_date | value | latest_ind | mod_dtime
latest_ind
列的值可以是1或0

我基本上想在这个表上运行一个更新脚本,它查找所有属性,这些属性的公共
开始日期和
最新索引都等于一,并将最新索引设置为零,除非记录是最新的

我已经成功地组合了下面的SELECT查询,但我不知道如何将其转换为更新。任何指点都将不胜感激

SELECT av.attribute_id, av.start_date, count(latest_ind), max(mod_dtime)
FROM t_attribute_value av 
where latest_ind = 1 
group by attribute_id, start_date
having count(latest_ind) > 1

在这种情况下,使用
CTE
进行
更新
非常方便:

;WITH ToUpdate AS (
   SELECT latest_ind,
          ROW_NUMBER() OVER (PARTITION BY attribute_id, start_date 
                             ORDER BY mod_dtime DESC) AS rn
   FROM attribute_value
   WHERE latest_ind = 1
)
UPDATE ToUpdate
SET latest_ind = 0
WHERE rn > 1

更新操作将传播到实际表。因此,如果是一个
属性id,start\u date
分区,其填充量大于1,则更新除最新记录以外的所有记录。

可能是这样的

方法1:使用
CTE

;WITH T AS
(   SELECT attribute_id, start_date, latest_ind,
    ROW_NUMBER() OVER (PARTITION BY av.attribute_id, av.start_date ORDER BY mod_dtime DESC) RN
    FROM t_attribute_value
    where latest_ind = 1
)
UPDATE T
SET latest_ind = 0
WHERE RN > 1
方法2:你不需要一个CTE

UPDATE T
SET T.latest_ind = 0
FROM t_attribute_value T
INNER JOIN
(
        SELECT attribute_id, start_date, latest_ind,
        ROW_NUMBER() OVER (PARTITION BY av.attribute_id, av.start_date ORDER BY mod_dtime DESC) RN
        FROM t_attribute_value
        where latest_ind = 1
) V
   ON T.attribute_id= V.attribute_id AND V.RN > 1

显示操作前后的示例表数据。