SQL: группировать строки по полю a или b - PullRequest
0 голосов
/ 01 мая 2019

Я не уверен, что это возможно в SQL.У меня есть два поля «а» и «б» в моей таблице.Я хочу сгруппировать записи в таблице, когда строки имеют одинаковые значения «a» или одинаковые значения «b», а затем извлечь значение другого поля с последней отметкой времени.Будет ли это возможно?Я использую Redshift.

Вот пример таблицы:

|| key1 || key2 || date || value ||
| 1 | 'a' | '2019-01-01' | 'john' |
| 1 | 'b' | '2019-01-03' | 'ben' |
| 2 | 'c' | '2019-02-01' | 'kim' |
| 3 | 'c' | '2019-02-02' | 'dan' |
| 4 | 'd' | '2019-02-03' | 'jan' |

В конечном итоге я хочу получить:

| 'ben' |
| 'dan' | 
| 'jan' |

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Вы можете попытаться записать набор результатов с помощью оконной функции ROW_NUMBER и SUM для этих двух клавиш.

Затем получите rn = 1 последнюю строку из группы.

Запрос 1 :

SELECT value 
FROM (
  SELECT value,
         sum(1) OVER(PARTITION BY key1 ORDER BY key1) cnt1,
         sum(1) OVER(PARTITION BY key2 ORDER BY key2) cnt2 ,
         ROW_NUMBER () OVER(PARTITION BY key1 ORDER BY date DESC) rn1,
         ROW_NUMBER () OVER(PARTITION BY key2 ORDER BY date DESC) rn2
  FROM T
) t1
WHERE 
   (rn1 = 1 and cnt1 > 1) 
or
   (rn2 = 1 and cnt2 > 1)
or 
   (cnt1 = 1 and cnt2 = 1)

Результаты :

| value |
|-------|
|   ben |
|   dan |
|   jan |
0 голосов
/ 01 мая 2019

Предположение: значения даты являются уникальными для всех записей.

Я придумал это:

select mytable.value1
  from (select key1, max(date1) max_date1 from mytable group by key1) q1
  inner join (select key2, max(date1) max_date1 from mytable group by key2) q2
    on q2.max_date1 = q1.max_date1
  inner join mytable on mytable.date1 = q1.max_date1

На основе этой схемы:

create table myTable (
  key1 int,
  key2 nvarchar(1),
  date1 date,
  value1 nvarchar(20)
  );

insert into mytable values
  (1, 'a', '2019-01-01', 'john'),
  (1, 'b', '2019-01-03', 'ben'),
  (2, 'c', '2019-02-01', 'kim'),
  (3, 'c', '2019-02-02', 'dan');
...