Оставить соединение в sql таблице? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующая SQL Таблица серверов:

+-------+----------+----------+----------+
| group | subgroup | position |  value   |
+-------+----------+----------+----------+
| D924  | A        | 50       | 9144142  |
| D924  | A        | 52       | 9268118  |
| D924  | A        | 60       | 9144588  |
| D924  | A        | 70       | 10116006 |
| D924  | A        | 110      | 9074177  |
| D924  | A        | 171      | 7367052  |
| D924  | A        | 180      | 10118595 |
| D924  | A        | 190      | 9074522  |
| D924  | B        | 150      | 12423396 |
| D955  | ...      | ...      | ...      |
+-------+----------+----------+----------+

Мне нужно перечислить все position для каждого subgroup в пределах одного group

Примерно так:

+-------+----------+----------+----------+
| group | subgroup | position |  value   |
+-------+----------+----------+----------+
| D924  | A        | 50       | 9144142  |
| D924  | A        | 52       | 9268118  |
| D924  | A        | 60       | 9144588  |
| D924  | A        | 70       | 10116006 |
| D924  | A        | 110      | 9074177  |
| D924  | A        | 171      | 7367052  |
| D924  | A        | 180      | 10118595 |
| D924  | A        | 190      | 9074522  |
| D924  | A        | 150      |          |
| D924  | B        | 50       |          |
| D924  | B        | 52       |          |
| D924  | B        | 60       |          |
| D924  | B        | 70       |          |
| D924  | B        | 110      |          |
| D924  | B        | 171      |          |
| D924  | B        | 180      |          |
| D924  | B        | 190      |          |
| D924  | B        | 150      | 12423396 |
| D955  | ...      | ...      | ...      |
+-------+----------+----------+----------+

Я бы хотел получить таблицу результатов в одном запросе SQL. Вы можете посоветовать?

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Это просто DISTINCT список значений position и [Group] & subgroup с LEFT JOIN возвращением в таблицу.

Выполнение 2 DISTINCT запросов будет дорого, поэтому, если у вас есть таблица ваших групп и должностей, я бы предложил использовать их, а не CTE:

WITH Groups AS
    (SELECT DISTINCT
            [group],
            subgroup
     FROM dbo.YourTable),
Positions AS
    (SELECT DISTINCT
            position
     FROM dbo.YourTable)
SELECT G.[Group],
       G.subgroup,
       P.Position,
       YT.[value]
FROM Groups G
     CROSS JOIN Positions P
     LEFT JOIN dbo.YourTable YT ON G.[Group] = YT.[Group]
                               AND G.subgroup = YT.subgroup
                               AND P.Position = YT.Position;
0 голосов
/ 04 марта 2020

Сначала выберите отдельные подгруппы и позиции, затем присоединитесь к ним, а внешние присоединитесь к вашему столу.

with sub as (select distinct group, subgroup from mytable)
   , pos as (select distinct group, position from mytable)
select
  sub.group. sub.subgroup, pos.position, t.value
from sub
join pos on pos.group = sub.group
left join mytable t on t.group = sub.group
                   and t.subgroup = sub.subgroup
                   and t.position = pos.position
order by t.group, t.subgroup, t.position;
0 голосов
/ 04 марта 2020

Кажется, вы хотите получить значение только для первой «позиции» в каждой группе. Это говорит о том, что row_number():

select group, subgroup, position,
       (case when row_number() over (partition by group, position order by subgroup) = 1
             then value
        end) as value
from t;

Здесь - это дБ <> скрипка.

...