Получить первое значение столбца на основе столбца даты, разделенного по идентификатору - PullRequest
0 голосов
/ 23 января 2019

Цель: Я бы хотел, чтобы в моих выходных данных отображался каждый отдельный subscription_id, первый идентификатор транзакции на основе самой ранней даты.

Проблема: subscription_ids в моем выводе не различимы.

Ситуация: У меня есть несколько столбцов в таблице, но полезны только три:

  • subscription_id
  • TRANSACTION_ID
  • issue_date

Каждый подписка может иметь несколько транзакций. Мне нужно выбрать первый transation_id для каждого subscription_id на основе самой ранней даты.

Запрос: Я пробовал следующие два запроса, думая, что они должны дать мне одинаковые результаты, но оба они разные. Кроме того, оба возвращают повторяющиеся идентификаторы subcription_id, когда должен быть указан только DISTINCT subscription_id.

SELECT DISTINCT t.subscription_id
    ,t.transation_id    
    ,MIN(t.issue_date)  As Min_Id
FROM table AS t
WHERE issue_date >= '2019-01-21'
GROUP BY t.subscription_id, t.transation_id
ORDER BY subscription_id desc


SELECT DISTINCT t.subscription_id
    ,FIRST_VALUE(t.transation_id)
        OVER (PARTITION BY t.subscription_id ORDER BY t.issue_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Min_id
    ,issue_date
FROM table AS t
WHERE issue_date >= '2019-01-21'
ORDER BY subscription_id desc

Я запустил макет данных как таковой, и это сработало.

INSERT INTO #test1
VALUES  
('2018-11-01', 'ABC@gmail.com')
,('2018-11-02', 'ABC@gmail.com')
,('2018-11-03', 'ABC@gmail.com')
,('2018-07-01', 'DEF@gmail.com')
,('2018-07-02', 'DEF@gmail.com')


SELECT DISTINCT EMAIL
    ,FIRST_VALUE(login_time)
        OVER(PARTITION BY email ORDER BY LOGIN_TIME ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS DATES
FROM #test1

Mock-up Output:
    EMAIL           DATES
    ABC@gmail.com  2018-11-01
    DEF@gmail.com  2018-07-01

Что я делаю не так или что отличается?

1 Ответ

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

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

  select * from 
    (SELECT *,
            row_number() OVER(PARTITION BY email ORDER BY LOGIN_TIME) AS rn
    FROM #test1
    ) t where t.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...