[英]Counting occurrences of an id in a database table
我在使用Oracle数据库查询和相关子查询时遇到了麻烦。 从根本上讲,问题在于计算一个表中的ID在另一表中出现的次数。
问题:我有两个表,一个订单表,该表存储有关Web服务中已订购商品的信息。 该表中的数据通过一个过程(我无法控制)运行,结果被放入一个已实现的表中。
订单号不是一件商品唯一的。 每个订单可以包含大量商品,并且每个商品都存储在一行中 。 但是,项目实际上可以是组合/包装,这就是流程要处理的内容。 一个项目,例如GAME_PACK,可以进入订单表,而另一端则出现GAME1,GAME2,GAME3,并由订单号关联。
问题是,有时这些项目无法正确地从流程中退出,然后line_item可能不会与已完成的项目相关联。 我可以利用可用资源来确定是否存在问题的唯一方法是,获取最大的line_number并将其与committed_item组的数量进行比较。
我尝试过的方法:最初,我认为这样做很简单,只需在按顺序编号的分区上使用rownumber()
或denserank()
分析函数,但它变得比这更加混乱。 当前是我正在使用的查询:
select *
from(
select max (item_index) over (partition by tbl.item_number) item_count, tbl.*
from (
select i.item_fulfill_number, i.order_number, row_number()over(partition by i.item_number, i.order_number order by i.order_number) item_index
from fulfilled_items i ) tbl
) results
inner join (
select *
from (
select orderinfo.order_number as order_order_number, orderinfo.line_number, orderinfo.ordered_item, row_number() over(partition by orderinfo.order_number order by orderinfo.line_number desc) order_row
from orderinfo
)
where order_row <= 1
)
on results.order_number = order_order_number
where results.item_count = results.item_index and ordered_item like 'GAME%'
请注意,现在我在计数匹配时进行提取,当我确定查询有效时,此逻辑将被逆转
约束条件
表结构和图形表示 (最大行号表示complied_item组的数量)
感谢您抽出时间来阅读。
其中项目来自订单表,结果为OK,则根据已完成的组是否与最大行数匹配来确定BAD。
如果我理解正确,则每个订单应具有与订单中的行号相同的履行组数量。 每个履行组的大小均未知,并由唯一的履行编号表示。 基于此,我认为查询应该像这样简单:
SELECT
main.*,
'BAD' AS result
FROM (
SELECT DISTINCT
o.order_number,
COUNT(o.line_number) OVER (PARTITION BY o.order_number) AS order_lines,
(SELECT COUNT(DISTINCT item_fulfill_number) FROM fulfilled_items f WHERE f.order_number = o.order_number) AS fulfilled_groups
FROM orders o
) main
WHERE order_lines != fulfilled_groups
子查询计算行数(以防万一跳过行号,但是如果您确实愿意,可以将其更改回最大行数)以及不同的实现组数。 整体查询返回两个计数不相等的那些订单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.