[英]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.