Mysql SQL-如何在较大的结果集中查询列的最新值

Mysql SQL-如何在较大的结果集中查询列的最新值,mysql,sql,Mysql,Sql,给定此包含源数据的架构 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

给定此包含源数据的架构

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;
使用这些数据,我想创建另一个表,其中包含每个eventId的eventDescription的最新值。我创建了以下查询以获得此结果:

SELECT max(eventDate) as maxEventDate, eventDescription, eventId 
FROM sourceData 
GROUP BY eventId, eventDescription 
ORDER by eventId;
我的预期结果是,每个eventId只有一条记录。但是,我为每个eventId获取多条记录。有没有关于如何调整查询以获得所需结果的建议

+--------------+----------------------------------------------------------------------+-----------------------------+
| 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 

如果您的dbms支持row_number(),那么您可以尝试以下方法

 select * from (SELECT *,
row_number() over(partition by eventId order by eventDate desc) rn
 FROM sourceData ) a where a,rn=1

如果您的dbms支持row_number(),那么您可以尝试以下方法

 select * from (SELECT *,
row_number() over(partition by eventId order by eventDate desc) rn
 FROM sourceData ) a where a,rn=1

您可以尝试将联接与子查询一起用于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

如果您需要不同的结果adddisctinct子句

,您可以尝试对max eventdate使用带有子查询的join

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

如果需要不同的结果add DISCTINT子句

一种简单有效的方法使用相关子查询:

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
                   );

此特定公式假设每个事件id的事件日期都是唯一的。对于性能,您需要一个
(eventId,eventDate desc)
——如果可能的话,
desc

一个简单有效的方法使用一个相关的子查询:

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
                   );

此特定公式假设每个事件id的事件日期是唯一的。对于性能,您需要
(eventId,eventDate desc)
上的索引——如果可能的话,
desc

您在
eventDescription
上分组,但每行的值不同,所以它不会卷到一行。尝试选择
MAX(eventDescription)
并将其从您的
分组中删除,如果您不关心显示的是哪个描述。如果需要,请更新源数据,使每个
eventId
都有一个单独的描述。您在
eventDescription
上分组,但每行的值不同,因此它不会汇总到一行。尝试选择
MAX(eventDescription)
并将其从您的
分组中删除,如果您不关心显示的是哪个描述。如果您真的在意,请更新源数据,使每个
eventId
都有一个单独的描述。