0

私のSQLはロールを持つユーザーIDのリストを返します。ポイントはすべてのロール(グループ)を1行に連結することです。現在のところ、すべてを返しますが、ユーザーごとに1つのエントリ、基本的にはそのユーザーの最大rn(行番号)を持つユーザーあたりのエントリを返すだけです。行数が最大の行を返す方法は?

SELECT 
    IT_ID, 
    SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2) GROUPS 
FROM (
    SELECT 
    U.IT_ID, 
    LAST_NAME, 
    BFIRST_NAME, 
    GRP, 
    ROW_NUMBER() OVER (partition by u.it_id ORDER BY U.IT_ID) rn, 
    COUNT(*) OVER() cnt 
FROM ECG_IT_USERS U 
JOIN SECUREGROUPS G ON U.IT_ID = G.IT_ID) 
START WITH rn = 1 
CONNECT BY rn = PRIOR rn + 1 and it_id = prior it_id 
Group by it_id 

これは戻します

IT_ID GROUPS 
afz23 ADMIN 
afz23 ADMIN, QA 
klf44 USER 
klf44 USER, BUSINESS 

を私は各IT_IDパーティション上行数の最大値を算出する別の分析機能を追加

IT_ID GROUPS 
afz23 ADMIN, QA 
klf44 USER, BUSINESS 

答えて

0

これはの問題です。ここにトピックに関する非常に包括的な答えがあります:SQL Select only rows with Max Value on a Column

時間が限られているため、私はあなたの質問に取り組むことができません。あなたに魚を与えるのではなく、釣り方を教える。

0

を返す必要があります。次に、rn = max_rnの行を選択します。

0
select it_id, groups 
from 
(
    select 
     it_id 
     , groups 
     , row_number() over (partition by id_id order by length(groups) desc) rn 
    from 
     (
      SELECT 
      IT_ID, 
      SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2) GROUPS 
      FROM (
      SELECT 
       U.IT_ID, 
       LAST_NAME, 
       BFIRST_NAME, 
       GRP, 
       ROW_NUMBER() OVER (partition by u.it_id ORDER BY U.IT_ID) rn, 
       COUNT(*) OVER() cnt 
      FROM ECG_IT_USERS U 
      JOIN SECUREGROUPS G ON U.IT_ID = G.IT_ID) 
      START WITH rn = 1 
      CONNECT BY rn = PRIOR rn + 1 and it_id = prior it_id 
      Group by it_id 
    ) 
) 
where rn = 1 
; 
関連する問題