Как удалить дубликаты из этого результата - PullRequest
0 голосов
/ 27 мая 2019

Как удалить дубликат из этого результата

select *,
       row_number() over (order by (select null)) as seqnum
from [elo].[dbo].[objkeys] 
where parentid in (select parentid
                   from [elo].[dbo].[objekte] 
                   inner join [elo].[dbo].[objkeys] on objid = parentid 
                   where objmask like 26 and okeydata like 'yes'
                   )

вывод

parentid   okeyname  okeydata
  1          name   a
  1      number     1
  1        yes_no   yes 
  2          name   a
  2      number     1
  2        yes_no   yes
  3          name   a
  3      number     1
  3        yes_no   no
  4          name   a
  4      number     2
  4          yes_no no
  5          name   b
  5      number     3
  5          yes_no yes
  6          name   b
  6      number     3
  6          yes_no yes
  7          name   b
  7      number     3
  7          yes_no no
  8          name   b
  8      number     3
  8          yes_no no

должно быть так

parentid   okeyname  okeydata
  1          name   a
  1      number     1
  1          yes_no yes 

  3          name   a
  3      number     1
  3          yes_no no

  5          name   b
  5      number     3
  5          yes_no yes


  7          name   b
  7      number     3
  7          yes_no no

Ответы [ 4 ]

0 голосов
/ 27 мая 2019

Я думаю, что поворот данных - это лучший формат, и вы сможете легко делать то, что хотите. Первый поворот:

select parentid,
       max(case when okeyname = 'name' then okeydata end) as name,
       max(case when okeyname = 'number' then okeydata end) as number,
       max(case when okeyname = 'yes_no' then okeydata end) as name
from [elo].[dbo].[objkeys]
group by parentid ;

Затем, чтобы получить первую парентиду, используйте подзапрос:

select min(parentid) as parentid, name, number, yes_no
from (select parentid,
             max(case when okeyname = 'name' then okeydata end) as name,
             max(case when okeyname = 'number' then okeydata end) as number,
             max(case when okeyname = 'yes_no' then okeydata end) as yes_no
      from [elo].[dbo].[objkeys]
      group by parentid
     ) p
group by name, number, yes_no;

А если вам нужен оригинальный формат, то снимите кружок:

select nny.parentid, v.*
from (select min(parentid) as parentid, name, number, yes_no
      from (select parentid,
                   max(case when okeyname = 'name' then okeydata end) as name,
                   max(case when okeyname = 'number' then okeydata end) as number,
                   max(case when okeyname = 'yes_no' then okeydata end) as yes_no
            from [elo].[dbo].[objkeys]
            group by parentid
           ) p
      group by name, number, yes_no
     ) nny cross apply
     (values ('name', name), 
             ('number', number),
             ('yes_no', yes_no)
     ) v(okeyname, okeydata)
0 голосов
/ 27 мая 2019

не похоже, что есть какие-то дубликаты записей, но из набора результатов кажется, что вам нужно минимальное парентирование и попробуйте, как показано ниже

    with cte as
    (
    your query output
    ) select min(parentid),okeyname,okeydata
   from cte group by okeyname,okeydata
0 голосов
/ 27 мая 2019

Если вы можете игнорировать 'parentid', вы можете использовать код ниже.

select distinct okeyname, okeydata, 
             row_number() over (order by (select null)) as seqnum
      from [elo].[dbo].[objkeys] 
      where parentid in (select parentid
                         from [elo].[dbo].[objekte] inner join
                              [elo].[dbo].[objkeys] 
                               on objid = parentid 
                         where objmask like 26 and okeydata like 'yes'
                        )
0 голосов
/ 27 мая 2019

Попробуйте ниже -

select * from
(
      select *,row_number() over (partition by okeyname,okeydata order by parentid) as seqnum
      from [elo].[dbo].[objkeys] inner join [elo].[dbo].[objekte]
      on objid = parentid 
      where objmask like 26 and okeydata like 'yes'
)A where seqnum=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...