PostgresSQL Заказ по смешанному - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть таблица:

Таблица - пользователь

user_id     name            country         role        function
1           abc1            US              Developer   IT
2           abc3            US              Developer   IT
3           abc4            US              Developer   IT
4           abc6            US              Developer   IT
5           abc8            US              Developer   IT
6           abc9            US              Developer   IT
7           abc5            Canada          Developer   IT
8           abc2            Canada          Accountant  Finance
9           abc7            US              Accountant  Finance
10          abc10           Canada          Developer   IT
11          abc11           Canada          Accountant  Finance
12          abc12           US              Accountant  Finance

Как я могу заказать таблицу выше, чтобы получить запись уникальной комбинации country, role и function.

Таким образом, результат будет выглядеть следующим образом:

user_id     name            country         role        function
1           abc1            US              Developer   IT
7           abc5            Canada          Developer   IT
9           abc7            US              Accountant  Finance
8           abc2            Canada          Accountant  Finance
2           abc3            US              Developer   IT
10          abc10           Canada          Developer   IT
12          abc12           US              Accountant  Finance
11          abc11           Canada          Accountant  Finance
3           abc4            US              Developer   IT
4           abc6            US              Developer   IT
5           abc8            US              Developer   IT
6           abc9            US              Developer   IT

Приведенные выше результаты с использованием следующей логики c:

  • Найти отличительные комбинация country, role и function
  • Возьмите первую запись ПЕРВОЙ отчетливой комбинации. Например Строка 1 имеет страну = США, роль = Разработчик, функция = IT
  • Возьмите первую запись Второй отдельной комбинации. Например Строка 2 имеет страну = Канада, роль = Разработчик, функция = IT
  • Возьмите первую запись ТРЕТЬЕЙ отличной комбинации. Например Строка 3 имеет страну = США, роль = Бухгалтер, функция = Финансы
  • Возьмите первую запись четвёртой четкой комбинации. Например Строка 4 имеет страну = Канада, роль = Бухгалтер, функция = Финансы

Теперь уникальных уникальных комбинаций нет, поэтому следующая запись будет из ПЕРВОЙ отчетливой комбинации.

Есть ли способ достичь этого в PostgresSQL?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

С ROW_NUMBER() оконной функцией:

SELECT t.user_id, t.name, t.country, t.role, t.function
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY country, role, function ORDER BY user_id) as rn
  FROM "user"
) t
ORDER BY rn, user_id

См. Демоверсию . Результаты:

| user_id | name  | country | role       | function |
| ------- | ----- | ------- | ---------- | -------- |
| 1       | abc1  | US      | Developer  | IT       |
| 7       | abc5  | Canada  | Developer  | IT       |
| 8       | abc2  | Canada  | Accountant | Finance  |
| 9       | abc7  | US      | Accountant | Finance  |
| 2       | abc3  | US      | Developer  | IT       |
| 10      | abc10 | Canada  | Developer  | IT       |
| 11      | abc11 | Canada  | Accountant | Finance  |
| 12      | abc12 | US      | Accountant | Finance  |
| 3       | abc4  | US      | Developer  | IT       |
| 4       | abc6  | US      | Developer  | IT       |
| 5       | abc8  | US      | Developer  | IT       |
| 6       | abc9  | US      | Developer  | IT       |

В ваших ожидаемых результатах строки с user_id s 8,9 и 11,12 расположены в обратном порядке, но вы не объяснили почему.

1 голос
/ 22 апреля 2020

Попробуйте это:

WITH data AS (
  SELECT row_number() OVER (PARTITION BY country, role, function) as rownum, *
  FROM user
)
SELECT *
FROM data
ORDER BY rownum
rownum  user_id name  country role       function
1       11      abc11 Canada  Accountant Finance
1       7       abc5  Canada  Developer  IT
1       12      abc12 US      Accountant Finance
1       5       abc8  US      Developer  IT
2       8       abc2  Canada  Accountant Finance
2       9       abc7  US      Accountant Finance
2       10      abc10 Canada  Developer  IT
2       4       abc6  US      Developer  IT
3       1       abc1  US      Developer  IT
4       3       abc4  US      Developer  IT
5       2       abc3  US      Developer  IT
6       6       abc9  US      Developer  IT
...