Как объединить две таблицы на основе ПЕРВОГО ЗНАЧЕНИЯ группы - PullRequest
0 голосов
/ 29 января 2019

Цель: Я хотел бы объединить две таблицы на основе первого значения столбца Id, сгруппированного по столбцу Id подписки, упорядоченному по столбцу созданному_ататуру.

Ситуация:

Таблица 1 выглядит следующим образом:

id  channel trx_date
123 organic 01/01/2019 05:00:00
234 direct  01/01/2019 05:01:00
987 add     01/01/2019 10:00:00
654 organic 01/01/2019 10:15:00

Таблица 2:

subscription_id id  os      created_at
sub890         123  mac     01/01/2019 05:00:01
sub890         234  mac     01/01/2019 05:01:01
sub111         987  windows 01/01/2019 10:00:01
sub111         654  mac     01/01/2019 10:20:01

Мне нужно взять самый ранний идентификатор в таблице 2, сгруппированный по идентификатору подписки, и внутреннее объединить его сТаблица 1. Итак, в этом примере мой вывод будет

subscription_id id  os      created_at id       channel trx_date
sub890          123 mac     01/01/2019 05:00:01 organic 01/01/2019 05:00:00
sub111          987 windows 01/01/2019 10:00:01 add     01/01/2019 10:00:00

Что я пробовал: Я думал об использовании FIRST_VALUE, но я застрял в том, как я могу их подключить

SELECT t1.*, 
  t2.subscription_id,
  t2.os,
  t2.created_at, 
  FIRST_VALUE(t2.id) OVER (PARTITION BY t2.subscription_id ORDER BY t2.created_at ASC) as Min_Id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.Min_id

Информация о скрипте:

CREATE TABLE table1
    ([id] varchar(13), [channel] varchar(50), [trx_date] Datetime)


INSERT INTO table1
VALUES
    ('123', 'organic', '2019-01-01 05:00:00'),
    ('234', 'direct', '2019-01-01 05:01:00'),
    ('987', 'add', '2019-01-01 10:00:00'),
    ('654', 'organic', '2019-01-01 10:15:00')

CREATE TABLE table2
    ([subscription_id] varchar(13),[id] varchar(13), [os] varchar(10), [created_at] Datetime)

INSERT INTO table2
VALUES
    ('sub890', '123', 'mac', '2019-01-01 05:00:01'),
    ('sub890', '234', 'mac', '2019-01-01 05:01:01'),
    ('sub111', '987', 'windows', '2019-01-01 10:00:01'),
    ('sub111', '654', 'mac', '2019-01-01 10:20:01')

Очевидно, что это не работает из-за предложения ON.Требуется ли в этой ситуации функция row_number с крестиком?Есть ли лучший способ сделать это?FIRST_VALUE - неправильная функция для использования?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

вы можете использовать row_number() с заказом по дате создания, который займет 1-й идентификатор

with cte as
(
select *,row_number() over(partition by subscription_id  order by created_at) rn
  from tabl2
) select cte.*,t1.* from cte 
       join table1 t1 on cte.id =t1.id
  where cte.rn=1

демонстрационная ссылка

subscription_id id  os    created_at           rn   id  channel  trx_date
sub890          123 mac   01/01/2019 05:00:01   1   123 organic 01/01/2019 05:00:00
sub111          987 windows 01/01/2019 10:00:01 1   987 add     01/01/2019 10:00:00
0 голосов
/ 29 января 2019

Используйте apply с top (1):

SELECT t1.*, t2.subscription_id, t2.id, t2.os, t2.created_at
FROM table1 t1 CROSS APPLY
     (SELECT TOP (1) t2.*
      FROM table2 t2 
      WHERE t1.id = t2.id
      ORDER BY t2.created_at ASC
     ) t2
...