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部分?