如何使用SQL查询从最早/最新的行开始区分列



如何区分列,但删除的行是从最早找到的/保留最后一行?

我试过一些方法,但都没用
下面是我想使用的原始列

parent_item_id
------------------------------------
9B3E7A72-D36A-42D3-A04C-186DEC409F93
942E1854-9EB4-4C19-8A1E-4FCC4953B50C
E75C7294-F0C4-4C6E-8C12-DF5FBC93FA3B
942E1854-9EB4-4C19-8A1E-4FCC4953B50C
942E1854-9EB4-4C19-8A1E-4FCC4953B50C

以下是我尝试过的方法:

  1. 使用distinct的默认行为,如下所示
    查询:
WITH tree AS (SELECT distinct(ic.parent_item_id) FROM dbo.item_combination ic, dbo.product p WHERE ic.child_item_id != p.item_id 
UNION ALL
SELECT ic.parent_item_id FROM tree t, dbo.item_combination ic WHERE t.parent_item_id=ic.child_item_id
)
SELECT DISTINCT (parent_item_id) from tree

结果:

parent_item_id
--
9B3E7A72-D36A-42D3-A04C-186DEC409F93
942E1854-9EB4-4C19-8A1E-4FCC4953B50C
E75C7294-F0C4-4C6E-8C12-DF5FBC93FA3B
  1. 这样使用row_number。但根据我的逻辑,它应该改变顺序,但为什么最终结果与方式1相同?查询:
WITH tree AS (SELECT distinct(ic.parent_item_id) FROM dbo.item_combination ic, dbo.product p WHERE ic.child_item_id != p.item_id 
UNION ALL
SELECT ic.parent_item_id FROM tree t, dbo.item_combination ic WHERE t.parent_item_id=ic.child_item_id
)
SELECT DISTINCT(parent_item_id) FROM 
( 
SELECT t.parent_item_id, [row_number]=ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM tree t  ORDER BY [row_number] DESC OFFSET 0 ROWS
) r
group by r.parent_item_id, r.[row_number]

结果:

parent_item_id
--
9B3E7A72-D36A-42D3-A04C-186DEC409F93
942E1854-9EB4-4C19-8A1E-4FCC4953B50C
E75C7294-F0C4-4C6E-8C12-DF5FBC93FA3B

我想要/期望的结果是这样的。

parent_item_id
--
9B3E7A72-D36A-42D3-A04C-186DEC409F93
E75C7294-F0C4-4C6E-8C12-DF5FBC93FA3B
942E1854-9EB4-4C19-8A1E-4FCC4953B50C

根据您的评论,我认为这是应该发生的:

  1. 您需要建立父子项目视图或产品源视图。这看起来像:
create view v_ProductSourceMap as
SELECT ic.parent_item_id as item_id, p.item_id as source_id
FROM dbo.item_combination ic left join dbo.product p on ic.child_item_id = p.item_id 
group by ic.parent_item_id, p.item_id
  1. 检查视图是否表示从其他项派生的所有项,对于新项,source_id将为null
select * from v_ProductSourceMap order by item_id, source_id
  1. 现在使用递归查询遍历映射
WITH tree AS (
SELECT item_id, source_id, 1 as depth, cast(ic.item_id as varchar(max)) as bc   
FROM v_ProductSourceMap ic
WHERE source_id is null 
UNION ALL
SELECT ic.item_id, source_id, t.depth + 1, t.bc + '>' + cast(ic.item_id as varchar(max)) 
FROM tree t, v_ProductSourceMap ic WHERE ic.source_id=t.item_id
)
select * from tree

从这里开始,看看深度和/或面包屑中的模式,找出你的排序顺序。

最新更新