Mysql SQL语句以查找上次促销日期
我们将非常感谢您的帮助。我试图从数据集中查找所有员工最近一次晋升的最后日期。数据集示例如下所示。 数据集-Mysql SQL语句以查找上次促销日期,mysql,sql,group-by,Mysql,Sql,Group By,我们将非常感谢您的帮助。我试图从数据集中查找所有员工最近一次晋升的最后日期。数据集示例如下所示。 数据集- mysql> select * from emp; +----+-------+-----------+------------+ | id | empid | title | startdate | +----+-------+-----------+------------+ | 1 | 111 | Associate | 2017-11-01 | | 2 |
mysql> select * from emp;
+----+-------+-----------+------------+
| id | empid | title | startdate |
+----+-------+-----------+------------+
| 1 | 111 | Associate | 2017-11-01 |
| 2 | 222 | ED | 2017-11-01 |
| 3 | 111 | Associate | 2017-12-01 |
| 4 | 222 | MD | 2017-12-01 |
| 5 | 111 | VP | 2018-01-01 |
| 6 | 222 | MD | 2018-01-01 |
| 7 | 111 | VP | 2018-02-01 |
| 8 | 222 | MD | 2018-02-01 |
+----+-------+-----------+------------+
我想要的输出-
+-------+-----------+----------------+
| empid | title | min(startdate) |
+-------+-----------+----------------+
| 222 | MD | 2017-12-01 |
| 111 | VP | 2018-01-01 |
+-------+-----------+----------------+
我试过这个SQL-
mysql> select empid, title, min(startdate)
from ( select * from emp ) x
group by title, empid
order by empid desc;
它输出所有组,如下所示-
+-------+-----------+----------------+
| empid | title | min(startdate) |
+-------+-----------+----------------+
| 222 | MD | 2017-12-01 |
| 222 | ED | 2017-11-01 |
| 111 | Associate | 2017-11-01 |
| 111 | VP | 2018-01-01 |
+-------+-----------+----------------+
仅将empid和max(startdate)作为子查询,并将其连接回主表:
SELECT *
FROM emp e
INNER JOIN
(SELECT empid, Max(startdate) recentpromo FROM emp GROUP BY empid) x
ON x.empid = e.empid AND x.recentpromo = e.startdate
如果你在mysql8上,你可以使用行号作为替代。如果一名员工在同一天被提升两次,这将同时获得两项记录,尽管我认为这不太可能发生
编辑,以便我们可以将其扩展到另一个级别:
SELECT
em.empid,
em.title,
min(em.startdate) as
FROM
emp em
INNER JOIN
(
SELECT e.empid, e.title
FROM emp e
INNER JOIN
(SELECT empid, Max(startdate) recentpromo FROM emp GROUP BY empid) x
ON x.empid = e.empid AND x.recentpromo = e.startdate
) frpt --find recent promo title
ON
em.empid = frpt.empid AND
em.title = frpt.title
GROUP BY
em.empid, em.title
仅将empid和max(startdate)作为子查询,并将其连接回主表:
SELECT *
FROM emp e
INNER JOIN
(SELECT empid, Max(startdate) recentpromo FROM emp GROUP BY empid) x
ON x.empid = e.empid AND x.recentpromo = e.startdate
如果你在mysql8上,你可以使用行号作为替代。如果一名员工在同一天被提升两次,这将同时获得两项记录,尽管我认为这不太可能发生
编辑,以便我们可以将其扩展到另一个级别:
SELECT
em.empid,
em.title,
min(em.startdate) as
FROM
emp em
INNER JOIN
(
SELECT e.empid, e.title
FROM emp e
INNER JOIN
(SELECT empid, Max(startdate) recentpromo FROM emp GROUP BY empid) x
ON x.empid = e.empid AND x.recentpromo = e.startdate
) frpt --find recent promo title
ON
em.empid = frpt.empid AND
em.title = frpt.title
GROUP BY
em.empid, em.title
您可以使用相关子查询筛选每个员工的最新职务,然后聚合:
select empid, title, min(startdate)
from emp e
where e.title = (
select e1.title
from emp e1
where e1.empid = e.empid
order by startdate desc
limit 1
)
group by empid, title
order by empid desc
:
empid | title | min(startdate)
----: | :---- | :-------------
222 | MD | 2017-12-01
111 | VP | 2018-01-01
empid | title | min(起始日期)
----: | :---- | :-------------
222 | MD | 2017-12-01
111 | VP | 2018-01-01
您可以使用相关子查询筛选每个员工的最新职务,然后聚合:
select empid, title, min(startdate)
from emp e
where e.title = (
select e1.title
from emp e1
where e1.empid = e.empid
order by startdate desc
limit 1
)
group by empid, title
order by empid desc
:
empid | title | min(startdate)
----: | :---- | :-------------
222 | MD | 2017-12-01
111 | VP | 2018-01-01
empid | title | min(起始日期)
----: | :---- | :-------------
222 | MD | 2017-12-01
111 | VP | 2018-01-01
提示:
按empid分组
。提示:按empid分组
。这是我最近宣传的最后一天。我想要最近升职的第一天。我尝试了MIN函数,但没有成功。你不能将其替换为MIN,但是你可以使用逻辑查找最新的促销,然后将其连接到emp表以查找该促销的标题,然后再次将其连接到emp以查找该标题的所有匹配项,然后你可以对其进行分组/MIN。no,它为我提供了最近促销的最后一天。我想要最近升职的第一天。我尝试了MIN函数,但没有成功。你不能将其替换为MIN,但是你可以使用逻辑查找最新的促销,然后将其连接到emp表以查找该促销的标题,然后再次将其连接到emp以查找该标题的所有匹配项,然后你可以分组/MIN themWelcome@mgms!如果我的答案正确回答了你的问题,请点击复选标记。。。谢谢欢迎@mgms!如果我的答案正确回答了你的问题,请点击复选标记。。。谢谢