Группировать строки со значением, зависящим от состояния другого столбца SQL - PullRequest
0 голосов
/ 10 июля 2020

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

Например enter image description here

should become введите описание изображения здесь

Это означает, что для значения столбца 5 возьмите значение, в котором столбец 4 является самым низким, а для столбца 7 возьмите значение, в котором столбец 6 является самым высоким.

Любая идея как добиться такого результата?

Ответы [ 4 ]

2 голосов
/ 10 июля 2020

Предполагается, что ваша группа определяется вашим ключевым столбцом

;with r as (
    select Key, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8,
    row_number() over(partition by key order by Col4) as c4,
    row_number() over(partition by key order by Col6 desc) as C6
)
select distinct r1.Key, r1.Col1, r1.Col2, r1.Col3, 
    r2.col4, r2.col5, 
    r3.col6, r3.col7, 
    r1.col8
from r r1
join r r2 on r2.key=r1.key and r2.c4=1
join r r3 on r3.key=r1.key and r3.c6=1
0 голосов
/ 10 июля 2020

Вы можете сделать это с помощью оконных функций, таких как MIN() и FIRST_VALUE():

select distinct
  [Key], Col1, Col2, Col3,
  min(Col4) over (partition by [Key]) Col4,
  first_value(Col5) over (partition by [Key] order by Col4) Col5,
  max(Col6) over (partition by [Key]) Col6,
  first_value(Col7) over (partition by [Key] order by Col6 desc) Col7,
  Col8
from tablename

См. demo . Результатов:

> Key | Col1 | Col2 | Col3 | Col4     | Col5      | Col6     | Col7      | Col8    
> :-- | :--- | :--- | ---: | :------- | :-------- | :------- | :-------- | :-------
> A   | XXX  | AAA  |    5 | 20190601 | PI0104163 | 20200303 | PI0113027 | 20190531
0 голосов
/ 10 июля 2020

Вы можете использовать FIRST_VALUE LAST_VALUE

select [Key], [Col 1], [Col 2], [Col 3], min([Col 4]) c4, c5, max([Col 6]) c6 , c7, min([Col 8]) c8
from
  (select [Key], [Col 1], [Col 2], [Col 3], [Col 4]
   , first_value([Col 5]) over (partition by [Key], [Col 1], [Col 2], [Col 3] order by [Col 4] rows between unbounded preceding and unbounded following ) c5
   , [Col 6]
   , last_value([Col 7]) over (partition by [Key], [Col 1], [Col 2], [Col 3] order by [Col 6] rows between unbounded preceding and unbounded following ) c7
   , [Col 8]
from tbl) t
group by [Key], [Col 1], [Col 2], [Col 3], c5, c7
0 голосов
/ 10 июля 2020

С вашим набором данных сложно работать, потому что у вас нет уникального ключа для каждой записи. Наличие уникального ключа значительно упростило бы запрос. Это делает то, о чем вы спрашиваете:

create table #temp ([Key] char(1), [Col 1] varchar(8), [Col 2] varchar(8), [Col 3] int, [Col 4] varchar(10), [Col 5] varchar(10), [Col 6] varchar(10), [Col 7] varchar(10), [Col 8] varchar(10))

insert into #temp values
('A', 'XXX', 'AAA', 5, '20190601', 'PI0104163', '20190429', 'PI0104163', '20190531'),
('A', 'XXX', 'AAA', 5, '20200129', 'PI0113027', '20200303', 'PI0113027', '20190531')

select distinct 
       t1.[Key]
      ,t1.[Col 1]
      ,t1.[Col 2]
      ,t1.[Col 3]
      ,[Col 4] = case when t1.[Col 4] < t2.[Col 4] then t1.[Col 4] else t2.[Col 4] end
      ,[Col 5] = case when t1.[Col 4] < t2.[Col 4] then t1.[Col 5] else t2.[Col 5] end
      ,[Col 6] = case when t1.[Col 6] > t2.[Col 6] then t1.[Col 6] else t2.[Col 6] end
      ,[Col 7] = case when t1.[Col 6] > t2.[Col 6] then t1.[Col 7] else t2.[Col 7] end
      ,t1.[Col 8]
from   #temp t1
       inner join #temp t2 on
         (t1.[Key]   =  t2.[Key]  ) and
         (t1.[Col 1] =  t2.[Col 1]) and
         (t1.[Col 2] =  t2.[Col 2]) and
         (t1.[Col 3] =  t2.[Col 3]) and
         ( /* do not match a record to itself */
           (t1.[Col 4] <> t2.[Col 4]) or
           (t1.[Col 5] <> t2.[Col 5]) or
           (t1.[Col 6] <> t2.[Col 6]) or
           (t1.[Col 7] <> t2.[Col 7])
         ) and
         (t1.[Col 8] = t2.[Col 8])

drop table #temp

Что возвращает эти данные:

Key  Col 1    Col 2    Col 3       Col 4      Col 5      Col 6      Col 7      Col 8
---- -------- -------- ----------- ---------- ---------- ---------- ---------- ----------
A    XXX      AAA      5           20190601   PI0104163  20200303   PI0113027  20190531
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...