SQL - как запросить самое последнее значение столбца в большом наборе результатов - PullRequest
1 голос
/ 27 июня 2019

Учитывая эту схему, содержащую исходные данные

CREATE TABLE `sourceData` (
  `eventDate` datetime NOT NULL,
  `eventType` varchar(255) DEFAULT NULL,
  `eventId` varchar(255) NOT NULL,
  `eventDescription` varchar(255) NOT NULL,
  `visitorId` varchar(255) NOT NULL,
  `acountId` varchar(255) NOT NULL,
  `eventCount` int(11) DEFAULT NULL,
  `minutesOnPage` int(11) DEFAULT NULL,
  `urlParameter` varchar(255) NOT NULL,
  `visitorIpAddress` varchar(255) NOT NULL,
  `eventDomain` varchar(255) NOT NULL,
  `vistorUserAgent` text,
  PRIMARY KEY (`eventDate`,`eventId`,`visitorId`,`accountId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Используя эти данные, я хочу создать другую таблицу, содержащую последнее значение eventDescription для каждого eventId.Я создал следующий запрос для получения этого результата:

SELECT max(eventDate) as maxEventDate, eventDescription, eventId 
FROM sourceData 
GROUP BY eventId, eventDescription 
ORDER by eventId;

Мой ожидаемый результат для этого состоял в том, что для каждого идентификатора события будет только 1 запись.Тем не менее, я получаю несколько записей для каждого события.Любые предложения о том, как я могу настроить свой запрос, чтобы получить желаемый результат?

+--------------+----------------------------------------------------------------------+-----------------------------+
| maxEventDate | eventDescription                                                     | eventId                     |
+--------------+----------------------------------------------------------------------+-----------------------------+
| 2019-06-25   | Settings - User Settings - New Password                              | _2SkneHp0dkIlHef52uPRGKaf34 |
| 2019-06-10   | Settings - User Settings_New Password                                | _2SkneHp0dkIlHef52uPRGKaf34 |
| 2019-06-21   | User Settings - New Password                                         | _2SkneHp0dkIlHef52uPRGKaf34 |
| 2019-06-04   | Offer Tab_Makegood Missed Spots - Preempt(s)_Show All Buyer Demos    | _3YDY4OVlw-L2OVSZruGcwATEcI |
| 2019-06-27   | Campaign Performance Details - Spot Detail - Back to Top             | _4_61DOJgg2J6y0wGleGeu30J4w |
| 2019-06-21   | Spot Detail - Back to Top                                            | _4_61DOJgg2J6y0wGleGeu30J4w 

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Вы можете попробовать использовать объединение с подзапросом для max eventdate

select * 
from sourceData s 
inner join  (
  SELECT max(eventDate) as maxEventDate,eventId 
  FROM sourceData 
  GROUP BY eventId 
  ) t on t.maxEventDate = s.eventDate and t.eventId = s.eventId

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

0 голосов
/ 27 июня 2019

Простой и эффективный метод использует коррелированный подзапрос:

select sd.*
from sourceData sd
where sd.eventId = (select sd2.eventDate
                    from sourceData sd2
                    where sd2.eventId = sd.eventId
                    order by sd2.eventDate desc
                    limit 1
                   );

Эта конкретная формулировка предполагает, что даты событий уникальны для каждого идентификатора события. А для производительности вам нужен индекс на (eventId, eventDate desc) - ну, если возможно, на desc.

0 голосов
/ 27 июня 2019

если ваша dbms поддерживает row_number (), вы можете попробовать, как показано ниже

 select * from (SELECT *,
row_number() over(partition by eventId order by eventDate desc) rn
 FROM sourceData ) a where a,rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...