如何使用SQL从组中忽略相同的连续记录

短跑

我有以下数据:

ItemID | ProdID | ItemTypeID
=======+========+===========
1001   | 100    | A
1002   | 100    | B
1003   | 100    | A
1004   | 100    | B
1005   | 100    | B  <- successive itemtype (should be excluded)
1006   | 100    | C
1007   | 200    | C
1008   | 200    | A

我想列出每个组中的ItemTypeID(LISTAGG),但没有相同的连续ID。所以我的结果应该是这样的:

ProdID | ItemTypes
=======+==========
100    | A,B,A,B,C <- not A,B,A,B,B,C (successive B)
200    | C,A
戈登·利诺夫

这很棘手。Listagg()甚至不允许distinct,因此所有工作都需要在子查询中完成。

您可以ItemTypeId使用行号差异法来识别连续的。然后,一旦确定了组,就可以按组进行汇总,然后执行以下操作listagg()

select ProdId,
       listagg(ItemId, ',') within group (order by seqnum) as items
from (select ProdId, ItemId, count(*) as NumItems,
             row_number() over (partition by ProdId order by min(ItemId)) as seqnum
      from (select t.*,
                   (row_number() over (partition by ProdId order by ItemId) -
                    row_number() over (partition by ProdId, ItemTypeId order by ItemId)
                   ) as grp
            from t
           ) t
      group by ProdId, ItemTypeId, grp
     ) t
group by ProdId;

编辑:

解决此问题的另一种方法lag()是查找新组的起点。前一种方法可让您获得计数。此方法可能更容易理解:

select ProdId,
       listagg(ItemId, ',') within group (order by ItemId) as items
from (select t.*
      from (select t.*,
                   lag(ItemTypeId) over (partition by ProdId order by ItemId) as prev_ItemTypeId
            from t
           ) t
      where prev_ItemTypeId is null or prev_ItemTypeId <> ItemTypeId
     ) t
group by ProdId;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于连续匹配记录的SQL记录中的标签组

来自分类Dev

SQL / Teradata:返回记录,其中连续行中的值相同

来自分类Dev

Oracle SQL:如何从组中查找记录

来自分类Dev

如何确定SQL Server中的连续日期记录

来自分类Dev

如何在Oracle SQL中检索相同日期的组中的第一条记录和最后一条记录

来自分类Dev

如何使用SQl语法从MySQL表中的组中选择最新记录

来自分类Dev

如何使用熊猫在时间序列中查找连续的相同数据

来自分类Dev

如何使用熊猫在时间序列中查找连续的相同数据

来自分类Dev

在AWK中,如何拆分与“记录”具有相同字符串的连续行?

来自分类Dev

如何从数据库中删除几乎相同记录的连续序列

来自分类Dev

如何从sql中的相同表中获取不匹配的记录?

来自分类Dev

使用正则表达式检查相同的连续组

来自分类Dev

如何只从mysql中获取连续记录?

来自分类Dev

在 MySql 中,如何根据记录 id 创建一组连续的值,其中特定的 related_id 可用

来自分类Dev

如何使用SQL仅选择每个组中的最新组?

来自分类Dev

如何从一组记录中获取第一条记录 MS sql

来自分类Dev

如果SQL查询中的记录相同,如何分配相同的唯一行号?

来自分类Dev

如何从不同的表中获取记录并忽略SQL中的重复日期?

来自分类Dev

SQL - 比较连续记录

来自分类Dev

如何在LINQ to SQL中的子查询中按组检查记录是否存在

来自分类Dev

如何从SQL中的一组数据中获取最中间的记录

来自分类Dev

如何在LINQ to SQL中的子查询中按组检查记录是否存在

来自分类Dev

SQL-如何根据子组中的其他值对子组中的记录进行有效分类?

来自分类Dev

Access SQL如何随机选择一组连续的行

来自分类Dev

如何根据SQL查询结果的顺序枚举连续的行组

来自分类Dev

基于SQL Server中的连续事件的组查询

来自分类Dev

在JVM中多次使用相同的命名组?

来自分类Dev

在JVM中多次使用相同的命名组?

来自分类Dev

如何进行优化的SQL查询以检索每个时间片组中的许多记录

Related 相关文章

  1. 1

    基于连续匹配记录的SQL记录中的标签组

  2. 2

    SQL / Teradata:返回记录,其中连续行中的值相同

  3. 3

    Oracle SQL:如何从组中查找记录

  4. 4

    如何确定SQL Server中的连续日期记录

  5. 5

    如何在Oracle SQL中检索相同日期的组中的第一条记录和最后一条记录

  6. 6

    如何使用SQl语法从MySQL表中的组中选择最新记录

  7. 7

    如何使用熊猫在时间序列中查找连续的相同数据

  8. 8

    如何使用熊猫在时间序列中查找连续的相同数据

  9. 9

    在AWK中,如何拆分与“记录”具有相同字符串的连续行?

  10. 10

    如何从数据库中删除几乎相同记录的连续序列

  11. 11

    如何从sql中的相同表中获取不匹配的记录?

  12. 12

    使用正则表达式检查相同的连续组

  13. 13

    如何只从mysql中获取连续记录?

  14. 14

    在 MySql 中,如何根据记录 id 创建一组连续的值,其中特定的 related_id 可用

  15. 15

    如何使用SQL仅选择每个组中的最新组?

  16. 16

    如何从一组记录中获取第一条记录 MS sql

  17. 17

    如果SQL查询中的记录相同,如何分配相同的唯一行号?

  18. 18

    如何从不同的表中获取记录并忽略SQL中的重复日期?

  19. 19

    SQL - 比较连续记录

  20. 20

    如何在LINQ to SQL中的子查询中按组检查记录是否存在

  21. 21

    如何从SQL中的一组数据中获取最中间的记录

  22. 22

    如何在LINQ to SQL中的子查询中按组检查记录是否存在

  23. 23

    SQL-如何根据子组中的其他值对子组中的记录进行有效分类?

  24. 24

    Access SQL如何随机选择一组连续的行

  25. 25

    如何根据SQL查询结果的顺序枚举连续的行组

  26. 26

    基于SQL Server中的连续事件的组查询

  27. 27

    在JVM中多次使用相同的命名组?

  28. 28

    在JVM中多次使用相同的命名组?

  29. 29

    如何进行优化的SQL查询以检索每个时间片组中的许多记录

热门标签

归档