0

Oracle 11Gを使用していますが、次の列と値を持つテーブルがあり、優先順位の列に基づいて各列の値を選択したいと思います。IDごとに1行だけが必要です。

ID    NAME   NAME_PRIORITY   COLOR   COLOR_PRIORITY
1     SAM       2             RED          1
1     SAM       2             GREEN        2
1     JOHN      1             BLUE         3
2     MARY      2             ORANGE       1
3     JON       2             RED          2
3     PETE      3             GREEN        1

望ましい結果

ID   NAME    NAME_PRIORITY   COLOR     COLOR_PRIORITY
1    JOHN       1             RED           1
2    MARY       2             ORANGE        1
3    JON        2             GREEN         1

PRIORITY#が最も低く、IDごとに1行しかないNAMEとCOLORを選択するにはどうすればよいですか。

4

3 に答える 3

2

1 つのオプションは次のとおりです。

select d.id, min(name) keep (dense_rank first order by name_priority) name,
       min(name_priority) name_priority,
       min(color) keep (dense_rank first order by color_priority) color,
       min(color_priority) color_priority
  from yourtab d
 group by id;
于 2013-03-06T16:23:27.883 に答える
0

row_number()の両方で使用して、結果を取得できます。name_prioritycolor_priority

select n.id,
  name, 
  name_priority,
  color,
  color_priority
from
(
  select id,
    name, 
    name_priority,
    row_number() over(partition by id order by name_priority) name_row
  from yourtable
) n
inner join
(
  select id,
    color, 
    color_priority,
    row_number() over(partition by id order by color_priority) color_row
  from yourtable
) c
  on n.id = c.id
  and n.name_row = c.color_row
where n.name_row = 1
  and c.color_row = 1

SQL FiddlewithDemoを参照してください。

row_number()優先度ごとにを取得したら、と行番号の結果を結合し、id行番号が1に等しい行のみを返します。

于 2013-03-06T16:16:07.953 に答える
0

このクエリはCommon Table ExpressionROW_NUMBER()

WITH nameList
AS
(
    SELECT  ID, Name,
            ROW_NUMBER() OVER (PARTITION BY ID 
                            ORDER BY NAME_PRIORITY) rn
    FROM    TableName
),
colorList
AS
(
    SELECT  a.ID, a.Name,
            b.Color, b.COLOR_PRIORITY,
            ROW_NUMBER() OVER (PARTITION BY a.ID 
                            ORDER BY COLOR_PRIORITY) rnB
    FROM    nameList a
            INNER JOIN tableName b
                ON a.ID = b.ID AND a.rn = 1
)
SELECT  ID, Name, Color, COLOR_PRIORITY
FROM    colorList
WHERE   rnB = 1
于 2013-03-06T16:16:30.350 に答える