簡體   English   中英

Oracle 按問題與 sql 查詢分組

[英]Oracle group by issue with sql query

PortfolioNumber LevelCode AccountNumber Status  track
123                2       A101          Failed  1
123                2       A102         Failed   1
123                2       A103         Passed   0

123                1       A101         Passed   0
123                1       A102         Passed   0
123                1       A103         Passed   0

123                3       A101        Failed    1
123                3       A102        Failed    1
123                3       A103        Failed    1

456                1       A406        Failed    1
456                1       A407        Passed    0  
456                1       A408        Failed    1

我通過對其他幾張表進行某些其他連接來獲得這張表,

此表數據表示什么 - 投資組合編號 (123) 在那里,我們總共有三個 AccountNumber。 我們有不同的 LevelCode(這里是 1,2,3),每個級別都被標記到投資組合編號,並且也將標記相同的 3 個帳號。 並且我們在每一行也有狀態...已創建跟蹤列 jsut 以失敗為 1 並通過為 0,我稍后在下面的查詢中嘗試使用(此列可以刪除)

我試圖找到的 -

每個唯一投資組合編號的最低級別代碼集(包含該集的所有三個accountNumber),其中任一狀態失敗

查詢 - Select PortfolioNumber, LevelCode, min(LevelCode), sum(track) from (table data that I get through some other tables join..pasteed above) group by PortfolioNumber, LevelCode sum(track) > 0'

但這並沒有給出正確的結果和所有列,現在沒有選項了

期望的結果 我是什么

PortfolioNumber LevelCode AccountNumber Status  track
123                  2     A101           Failed  1
123                  2     A102           Failed  1
123                  2     A103           Passed  0

456                  1     A406           Failed  1
456                  1     A407           Passed  0 
456                  1     A408           Failed  1

使用 Oracle

這個查詢:

select distinct PortfolioNumber, 
       min(LevelCode) over (partition by PortfolioNumber) LevelCode
from tablename
group by PortfolioNumber, LevelCode
having sum(track) > 0

返回您想要的 PortfolioNumber/LevelCode 組合。
將它與運算符IN一起使用以獲取表的行:

select * 
from tablename
where (PortfolioNumber, LevelCode) in (
  select distinct PortfolioNumber, 
         min(LevelCode) over (partition by PortfolioNumber) LevelCode
  from tablename
  group by PortfolioNumber, LevelCode
  having sum(track) > 0
)

請參閱演示
結果:

> PORTFOLIONUMBER | LEVELCODE | ACCOUNTNUMBER | STATUS | TRACK
> --------------: | --------: | :------------ | :----- | ----:
>             123 |         2 | A101          | Failed |     1
>             123 |         2 | A102          | Failed |     1
>             123 |         2 | A103          | Passed |     0
>             456 |         1 | A406          | Failed |     1
>             456 |         1 | A407          | Passed |     0
>             456 |         1 | A408          | Failed |     1

我想我只會使用相關的子查詢:

select t.*
from t
where t.levelcode = (select min(t2.levelcode)
                     from t t2
                     where t2.portfolionumber = t.portfolionumber and
                           t2.status = 'Failed'
                    );

這似乎是最簡單的解決方案,可以通過(portfolionumber, status, levelcode)上的索引輕松優化。

如果您願意,使用 window 函數的類似方法是:

select t.*
from (select t.*,
             min(case when status = 'failed' then levelcode end) over (partition by portfolionumber) as min_failed_levelcode
      from t
     ) t
where levelcode = min_failed_levelcode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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