Получение уникальных идентификаторов, но не потеря данных, используя SQL - PullRequest
1 голос
/ 18 апреля 2020

Учитывая таблицу sale, где id не является уникальным:

id  name     item   quantity
1   Darsh    shoes      5
2   Liyah    oil        1
2   Eiliyah  watch      1
3   Zakaria  notebook   2
3   Elliot   shirt      3
4   Reese    bag        1

Мне нужно выбрать все уникальные идентификаторы для строки и не терять какие-либо данные (как для id in (2,3), где оба имени , пункт и количество должны отображаться в одной строке). Также в таблице sale может быть максимум 2 одинаковых id.

Я пытался использовать row_number (), чтобы получить несколько уникальных шаблонов. Из этого запроса:

Select a.id,a.name,a.item,a.quantity,b.name as name2,b.item as item2,b.quantity as quantity2
       ,row_number() over(partition by a.id order by a.id) as f1
       ,row_number() over(partition by a.name order by a.id) as f2
from sale a inner join sale b on a.id = b.id

Я получил это

id  name    item    quantity  name2    item2    quantity2  f1   f2
1   Darsh   shoes     5       Darsh    shoes    5          1    1
2   Eiliyah watch     1       Liyah    oil      1          2    1
2   Eiliyah watch     1       Eiliyah  watch    1          4    2
3   Elliot  shirt     3       Zakaria  notebook 2          2    1
3   Elliot  shirt     3       Elliot   shirt    3          4    2
2   Liyah   oil       1       Eiliyah  watch    1          3    1
2   Liyah   oil       1       Liyah    oil      1          1    2
4   Reese   bag       1       Reese    bag      1          1    1
3   Zakaria notebook  2       Elliot   shirt    3          3    1
3   Zakaria notebook  2       Zakaria  notebook 2          1    2

Теперь вот проблема, если я фильтрую f1, f2 и использую IIF для удаления повторяющихся данных, используя этот запрос:

Select id,name,item,quantity
      ,iif(name = name2,NULL,name2) as name2
      ,iif(item = item2,NULL,item2) as item2
      ,iif(quantity = quantity2,NULL,quantity2) as quantity2
from (
  Select a.id,a.name,a.item,a.quantity,b.name as name2,b.item as item2,b.quantity as quantity2
         ,row_number() over(partition by a.id order by a.id) as f1
         ,row_number() over(partition by a.name order by a.id) as f2
  from sale a inner join sale b on a.id = b.id
  )t
where (f1=1 and f2=1) or(f1=3 and f2=1)
order by id

затем quantity2 (ноль) во 2-й строке, как показано ниже.

id  name    item    quantity    name2   item2   quantity2
1   Darsh   shoes     5         NULL    NULL    NULL
2   Liyah   oil       1         Eiliyah watch   NULL
3   Zakaria notebook  2         Elliot  shirt   3
4   Reese   bag       1         NULL    NULL    NULL

Таким образом, могут быть одинаковые quantity для разных item и name.

Ожидаемый результат:

id  name    item    quantity    name2   item2   quantity2
1   Darsh   shoes     5         NULL    NULL    NULL
2   Liyah   oil       1         Eiliyah watch   1
3   Zakaria notebook  2         Elliot  shirt   3
4   Reese   bag       1         NULL    NULL    NULL

Пожалуйста, помогите мне. Спасибо!

Ответы [ 2 ]

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

Один метод - условная агрегация. , , если вы знаете, что для идентификатора существует не более двух дубликатов:

select id,
       max(case when seqnum = 1 then name end) as name_1,
       max(case when seqnum = 1 then item end) as item_1,
       max(case when seqnum = 1 then quantity end) as quantity_1,
       max(case when seqnum = 2 then name end) as name_2,
       max(case when seqnum = 2 then item end) as item_2,
       max(case when seqnum = 2 then quantity end) as quantity_2
from (select s.*,
             row_number() over (partition by id order by id) as seqnum
      from sale s
     ) s
group by id;
0 голосов
/ 18 апреля 2020

Согласно вашему ожидаемому результату. Вы можете создать временную таблицу (или промежуточную таблицу), и так как существует максимум тех же двух идентификаторов, то это может быть ваш ответ:

select *,row_number() over (partition by id order by id) as u_id into #test from sale
select * from (select * from #test where u_id=1) a
left join (select * from #test where u_id=2)b
on a.id = b.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...