Mysql 在另一列上分组时同时选择最小值和最大值
我已经被以下问题困扰了好几天了。 我的基表如下所示:Mysql 在另一列上分组时同时选择最小值和最大值,mysql,sql,Mysql,Sql,我已经被以下问题困扰了好几天了。 我的基表如下所示: departure; departure_date; destination; entered_on FRA; 2015-10-01; SIN; 2015-09-18 06:24:31 SIN; 2015-10-02; SYD; 2015-09-18 06:24:31 FRA; 2015-10-01; HKG; 2015-09-18 06:28:44 HKG; 2015-10-04; SYD; 2015-09-18 06:28:4
departure; departure_date; destination; entered_on
FRA; 2015-10-01; SIN; 2015-09-18 06:24:31
SIN; 2015-10-02; SYD; 2015-09-18 06:24:31
FRA; 2015-10-01; HKG; 2015-09-18 06:28:44
HKG; 2015-10-04; SYD; 2015-09-18 06:28:44
SYD; 2015-10-06; LAX; 2015-09-18 06:28:44
我要做的是获取mininum出发日期的出发点和最大出发日期的目的地,按输入的_on日期分组。
因此,结果如下所示:
departure; destination; entered_on
FRA; SYD; 2015-09-18 06:24:31
FRA; LAX; 2015-09-18 06:28:44
我尝试过无数的子查询变体,但都失败了。
我做的主要是:
SELECT *,
(SELECT departure
FROM table
WHERE departure_date = (SELECT MAX(departure_date) FROM table)
) AS maxdep
FROM `table`
但这并没有给我想要的结果。
这是可能的还是我走错了方向
好的,我已经为小提琴添加了结构:
因此,这意味着最初发布的表是通过子查询创建的。我并不清楚您查询的目的,但您可以从分组查询开始:
SELECT
entered_on,
MIN(departure_date) AS min_date,
MAX(departure_date) AS max_date
FROM
yourtable
GROUP BY
entered_on
然后,您可以使用两个不同的别名将此查询的结果与表联接两次:
SELECT
t1.departure,
t2.destination,
d.entered_on
FROM (
SELECT
entered_on,
MIN(departure_date) AS min_date,
MAX(departure_date) AS max_date
FROM
yourtable
GROUP BY
entered_on
) AS d INNER JOIN yourtable t1
ON d.entered_on = t1.entered_on AND d.min_date = t1.departure_date
INNER JOIN yourtable t2
ON d.entered_on = t2.entered_on AND d.max_date = t2.departure_date
请看小提琴。您可以试试这个:
SELECT
SUBSTRING_INDEX(GROUP_CONCAT(t.departure ORDER BY departure_date), ",", "1") AS departure,
SUBSTRING_INDEX(GROUP_CONCAT(t.destination ORDER BY departure_date DESC), ",", "-1") AS destination,
t.entered_on
FROM tableName AS t
GROUP BY t.entered_on
编辑1:如@dnoeth在中指出的,在concat组内添加订单
评论
这是你的电话号码
编辑2:我发布的原始表格是通过以下方式创建的:SELECT*,SELECT created_on FROM created WHERE created.flights_id=flights.id AS
从flights创建了_on,因此创建的_on列不是原始的
桌子的一部分。我试着在之后将整个查询放入子查询中
你的
这是在大多数其他DBMS中的。这将是一个简单的第一个值,通过按离开日期输入的顺序和目标的类似的最后一个值在分区上离开,但MySQL不支持这些窗口聚合函数 您可能会使用一个老技巧:将第二列连接到第一列
select *,
concat(departure_date, departure),
concat(departure_date, destination)
from tab;
然后对组合列执行MAX/MIN,最后使用子字符串提取第二列:
select entered_on,
substring(min(concat(departure_date, departure)) from 11),
substring(max(concat(departure_date, destination)) from 11)
from tab
group by entered_on
在无数的子查询变体中,您尝试在此处添加了一个,但您不会得到帮助。谢谢您的提示,添加了自己的示例:这取决于源表中的行顺序:您需要将order BY添加到GROUP_CONCAT:谢谢您的回复,您的fiddle示例有效,但在我的情况下不行。这可能是因为我发布的原始表是通过以下方式创建的:SELECT*,SELECT created\u on FROM created WHERE created.flights\u id=flights.id作为flights创建的,因此created\u on列最初不是表的一部分。我试着在您的FROM之后将整个查询放入子查询中,但没有结果:@user5355646最好更新您的问题和所有涉及一些示例数据的表,或者创建一个ok谢谢,添加了fiddle链接。现在,当我将此查询作为子查询添加到您建议的FROM部分时,它给了我错误的结果。非常感谢!连接另一个表,而不是通过子查询将其包括在内,这样做了。出于好奇:我一直认为在这种情况下,两种方法都可以,但事实似乎并非如此?还是我只是实现了错误的子查询?
select entered_on,
substring(min(concat(departure_date, departure)) from 11),
substring(max(concat(departure_date, destination)) from 11)
from tab
group by entered_on