Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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在3行中显示具有重复值的行_Sql_Sql Server 2005 - Fatal编程技术网

SQL在3行中显示具有重复值的行

SQL在3行中显示具有重复值的行,sql,sql-server-2005,Sql,Sql Server 2005,嗨,我有一个下表说价格 CostID ItemID Level EffectiveFrom EffectiveTo 6274751 12345 1 12/02/2013 NULL 6274751 12345 1 13/02/2013 NULL 6274751 12345 2 12/02/2013 NULL 6254784 12345 1 12/02/2013 NULL 6254

嗨,我有一个下表说价格

CostID   ItemID  Level  EffectiveFrom EffectiveTo            
6274751  12345   1       12/02/2013   NULL
6274751  12345   1       13/02/2013   NULL
6274751  12345   2       12/02/2013   NULL
6254784  12345   1       12/02/2013   NULL
6254784  12345   1       13/02/2013   NULL
6244784  12345   9       12/02/2013   NULL
我希望能够编写一个查询,通过比较3列“CostID”“ItemID”和“Level”来查找重复的行,并仅显示重复的行

预期输出第1部分

CostID   ItemID  Level  EffectiveFrom EffectiveTo            
6274751  12345   1       12/02/2013   NULL
6274751  12345   1       13/02/2013   NULL
6254784  12345   1       12/02/2013   NULL
6254784  12345   1       13/02/2013   NULL
一旦我得到上面的结果,我想从最后一个重复的行更新EffectiveTo表

第2部分的预期产出

CostID   ItemID  Level  EffectiveFrom EffectiveTo            
6274751  12345   1       12/02/2013   13/02/2013
6274751  12345   1       13/02/2013   NULL
6254784  12345   1       12/02/2013   13/02/2013
6254784  12345   1       13/02/2013   NULL
我试过这个:

{
SELECT *
FROM price
WHERE ItemID IN
    (     SELECT ItemID
          FROM price
          GROUP BY ItemId          HAVING COUNT(distinct level) > 1
    )
ORDER BY CostID } 
对于查询的第一部分,但无法获得我想要的结果,如果您有任何帮助,我们将不胜感激


谢谢

这将为您提供重复的行:

select distinct p.*
from price p
join price q
    on p.CostID = q.CostID
    and p.ItemID = q.ItemID
    and p.Level = q.Level
    and p.EffectiveFrom != q.EffectiveFrom
条件
p.EffectiveFrom!=q、 EffectiveFrom
非常重要,因为它会停止所有行连接到它们自己。通常,您只需比较id列的不平等性,但您的表似乎没有


要使用适当的结束日期更新旧行,请执行以下操作:

update p set
p.EffectiveTo = dateadd(day, -1, q.EffectiveFrom)
from price p
join price q
    on p.CostID = q.CostID
    and p.ItemID = q.ItemID
    and p.Level = q.Level
    and p.EffectiveFrom < q.EffectiveFrom
更新p集
p、 生效日期=日期添加(日期-1,q.EffectiveFrom)
从价格p
加入价格q
关于p.CostID=q.CostID
p.ItemID=q.ItemID
p.水平=q.水平
p.EffectiveFrom
此查询唯一的真正区别是将不等式更改为小于,从而仅选择更新较早的行


请注意,我从后面的日期中减去了1天,因此没有重叠。

这一天有点长……但您可以做一些改进

;WITH cte AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY CostID, ItemID, Level ORDER BY CostID, EffectiveFrom) AS RNUM,
        CostID,
        ItemID,
        Level,
        EffectiveFrom,
        EffectiveTo
    FROM @Price
),
cteDup AS 
(
    SELECT DISTINCT CostID, ItemID, Level FROM cte WHERE RNUM > 1
)
SELECT tt.* FROM @Price tt
INNER JOIN cteDup cc ON tt.CostID = cc.CostID AND tt.ItemID = cc.ItemID AND tt.Level = cc.Level
更新:这将直接更新,不确定这是否是您想要的

;WITH cte AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY CostID, ItemID, Level ORDER BY CostID, EffectiveFrom) AS RNUM,
        CostID,
        ItemID,
        Level,
        EffectiveFrom,
        EffectiveTo
    FROM @Price
)
UPDATE c1 SET 
     EffectiveTo = c2.EffectiveFrom
FROM cte c1
INNER JOIN cte c2 ON c1.CostID = c2.CostID  AND c1.ItemID = c2.ItemID AND c1.Level = c2.Level AND c1.RNUM + 1 = c2.RNUM

您使用的是什么sql?sql Server 2005,谢谢您为我格式化它。您需要确定的sql太多了。请具体说明。请提供您的预期输出。使用此查询,我得到的结果太多,但如果我的表中有41000条记录,在运行查询后,我得到100000条记录。我只想看到大约1000条重复记录,这样我就可以手动执行第2部分了。就像在我的示例中,我有6条记录,在运行查询之后,我希望看到4条重复的记录。谢谢您是否有多行(超过2行)具有相同的关键数据?当我运行第二个查询时,它说表“price”是模糊的。它会看到您有许多带有sand值的记录,因此我添加了
distinct
关键字来解决这个问题:第一个查询现在应该可以了。至于更新,我也纠正了这一点,尽管多个共享记录要复杂得多。它可以工作(不是错误),但是你可以有几行相同的日期对不起,我在更新p集上使用了price,所以我得到了这个错误,但是一旦我修复了,我得到了一个新的错误,有效的无法更新,但是我可以手动复制日期和时间并粘贴它,它工作正常。这给了我完美的结果,但一旦显示结果,则无法更新。是否有更新查询来实现第2部分而不必执行第1部分?