Нумерация групп в избранных (Oracle) - PullRequest
8 голосов
/ 20 декабря 2010

У меня есть следующий пример - таблица с именем, отделом и страной. Мне нужно создать оператор выбора, который перечисляет все записи и присваивает уникальный номер каждой группе департамента и страны (столбец Группа в примере):

Name   Department   Country   Group
====== ============ ========= =====
James  HR           UK        1
John   HR           UK        1
Alice  Finance      UK        2
Bob    Finance      DE        3
Frank  Finance      DE        3

Я думал о некоторых избранных с аналитической функцией, но я нашел только row_number() over (partition by department, country), который нумерует записи внутри группы, а не сами группы. У вас есть идеи, как решить эту проблему? Спасибо!

Ответы [ 2 ]

10 голосов
/ 20 декабря 2010
SELECT  t.*, q.grp
FROM    (
        SELECT  q.*, rownum AS grp
        FROM    (
                SELECT  DISTINCT department, country
                FROM    mytable
                ORDER BY
                        department, country
                ) q
        ) q
JOIN    mytable t
ON      t.department = q.department
        AND t.country = q.country 

или

SELECT  t.*, DENSE_RANK() OVER (ORDER BY department desc, country desc) AS grp
FROM    mytable
0 голосов
/ 20 декабря 2010

Это немного неуклюже, но вы можете выполнить подзапрос (или в этом случае, используя предложение with) для таблицы, чтобы получить отдельный отдел для каждой страны, а затем получить из этого сумму.

set echo on

DROP TABLE TESTXX

 DROP TABLE TESTXX succeeded.
CREATE
    TABLE TESTXX
    (
      NAME       VARCHAR2 ( 10 )
    , DEPARTMENT VARCHAR2 ( 15 )
    , COUNTRY    VARCHAR2 ( 2 )
    ) 

CREATE  succeeded.
INSERT INTO TESTXX VALUES
    ( 'James', 'HR', 'UK'
    ) 

1 rows inserted
INSERT INTO TESTXX VALUES
    ( 'John', 'HR', 'UK'
    ) 

1 rows inserted
INSERT INTO TESTXX VALUES
    ( 'Alice', 'FI', 'UK'
    ) 

1 rows inserted
INSERT INTO TESTXX VALUES
    ( 'Bob', 'FI', 'DE'
    ) 

1 rows inserted
INSERT INTO TESTXX VALUES
    ( 'Frank', 'FI', 'DE'
    ) 

1 rows inserted

.

WITH
    X AS
    (SELECT
        XX.*
      , ROWNUM R
      FROM
        (SELECT
            DEPARTMENT
          , COUNTRY
          FROM
            TESTXX
          GROUP BY
            COUNTRY
          , DEPARTMENT
          ORDER BY
            COUNTRY DESC
          , DEPARTMENT DESC
        ) XX
    )
  SELECT
      T.*
    , X.R
    FROM
      TESTXX T
    INNER JOIN X
    ON
      T.DEPARTMENT  = X.DEPARTMENT
      AND T.COUNTRY = X.COUNTRY
    ORDER BY
      T.COUNTRY DESC
    , T.DEPARTMENT DESC

NAME       DEPARTMENT      COUNTRY R                      
---------- --------------- ------- ---------------------- 
James      HR              UK      1                      
John       HR              UK      1                      
Alice      FI              UK      2                      
Bob        FI              DE      3                      
Frank      FI              DE      3                      

5 rows selected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...