簡體   English   中英

計算ID在數據庫表中的出現次數

[英]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%'

請注意,現在我在計數匹配時進行提取,當我確定查詢有效時,此邏輯將被逆轉

約束條件

  • 無權拆分項目
  • 查詢應該可以快速運行,我們正在處理多達50,000條記錄
  • 在22秒到2分鍾的執行時間內對查詢進行了測試
  • 將使用分頁,如果您回答,則不必擔心將其包括在內,但這是要考慮的事情,因為它可以極大地幫助或損害查詢的速度
  • 我無法觸摸桌子結構

表結構和圖形表示 流程運行后,訂單表和已完成項目表之間的關系 (最大行號表示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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM