Группировка в SQL плоский стол - PullRequest
0 голосов
/ 28 сентября 2019

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

Ниже моя таблица

ID  Email       Email_Date  Phone       Phone_Date
1   abc@t.com   2019-09-28  4151234567  2018-09-28
1   def@t.com   2018-09-28  4150000000  2019-09-28
2   xyz@t.com   2018-09-28  3150004567  2019-09-28
2   opx@t.com   2019-09-28  3151234567  2018-09-28

Это ожидаемый результат

ID  Email       PHone
1   abc@t.com   4150000000
2   opx@t.com   3150004567

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Как я упоминаю в комментариях, здесь что-то кажется "неправильным";как вам INSERT строка на более позднюю дату, которая имеет "последнее" значение для Phone, но каким-то образом имеет более старую версию для Email?Это «пахнет» как любой процесс, который вы используете для INSERT данных, имеет недостатокНа самом деле у вас должен быть один столбец для версии строки;дизайн, подобный этому, будет очень трудно поддерживать.

Это будет означать, что ваши данные могут выглядеть примерно так:

ID  Email      Phone       Updated_Date
1   def@t.com  4151234567  2018-09-28
1   def@t.com  4150000000  2019-09-28
1   abc@t.com  4150000000  2019-09-28

Обратите внимание, что приведенное выше означает, что было 2 измененията же самая дата (одна возвращающая значение электронной почты);поэтому вам нужно добавить дополнительный столбец идентификатора версии (столбец IDENTITY будет работать нормально) или , вам нужно будет указать время изменения, а также дату.Без добавления идентификатора версии или времени у вас нет возможности узнать, какая из последних 2 строк является «правильной» (поскольку вы не можете понять это с помощью ORDER BY, а таблицы этого не делаютсохраняйте данные в «порядке, в котором они были вставлены»).

В любом случае, я бы использовал метод, подобный тому, который я ранее отмечал как дубликат (все еще используя ROW_NUMBER), но с добавлением некоторой условной агрегации:

WITH CTE AS(
    SELECT ID,
           Email,
           ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Email_Date DESC) AS Email_RN,
           Phone,
           ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Phone_Date DESC) AS Phone_RN
    FROM YourTable)
SELECT ID,
       MAX(CASE Email_RN WHEN 1 THEN Email END) AS Email,
       MAX(CASE Phone_RN WHEN 1 THEN Phone END) AS Phone
FROM CTE
GROUP BY ID;
0 голосов
/ 28 сентября 2019

Вам нужны результаты из разных строк для каждого идентификатора, поэтому сделайте трюк, объединив дату в электронном письме или по телефону, чтобы получить максимальную дату:

with cte as (
  select id,
    max(concat(email_date, email)) email,
    max(concat(phone_date, phone)) phone
  from tablename
  group by id
)
select id,
  substring(email, 20, len(email)) email,
  substring(phone, 20, len(phone)) phone
from cte

См. Демонстрационную версию ,Результаты:

> id | email     | phone     
> -: | :-------- | :---------
>  1 | abc@t.com | 4150000000
>  2 | opx@t.com | 3150004567
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...