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
都有一个单独的描述。