MySQL - 按最新和加入第一个实例分组

时间:2017-05-24 11:56:45

标签: mysql

我尝试过一些事情,但最终让自己感到困惑。

我要做的是从表格中找到最新的记录,然后在特定日期之后加入第一个记录。

一个例子可能是

id | acct_no | created_at          | some_other_column
 1 |  A0001  | 2017-05-21 00:00:00 | x
 2 |  A0001  | 2017-05-22 00:00:00 | y
 3 |  A0001  | 2017-05-22 00:00:00 | z

理想情况下,我希望找到按acct_no排序的每个created_at DESC的最新记录,以便按唯一帐号对结果进行分组,因此从上面的记录中可以看出3 {1}},但显然会有多个不同的帐号,其中包含不同日期的记录。

然后,我想要达到的目的是加入同一张桌子,并在特定日期之后找到具有相同帐号的第一张记录。

例如,对于1 acct_no之后加入A0001之后的查询,将返回记录2017-05-21 00:00:00,因为它是等于此之后的第一个结果日期,因此按created_at ASC AND created_at >= "2017-05-21 00:00:00"排序(可能AND id != latest.id

看起来很直接,但我无法让它发挥作用。

在丢弃多个不同的查询后,我只有最近的尝试。

这里我试图解决第一部分,即选择最新的每个帐号:

SELECT latest.* FROM my_table latest
JOIN (SELECT acct_no, MAX(created_at) FROM my_table GROUP 
BY acct_no) latest2
ON latest.acct_no = latest2.acct_no

但仍会返回所有行,而不是最新的行。

我确实在子查询中使用了一个连接,但在完成之前我花了很长时间才运行它,但我在acct_nocreated_at上有索引但是我也遇到了select中的列不在group by中的其他问题。我知道这可以关闭,但我正在尝试找到一种方法来执行不需要的查询。

3 个答案:

答案 0 :(得分:1)

尝试对初始查询进行一些编辑:

{{1}}

答案 1 :(得分:0)

您需要获取创建最大日期的ID。

SELECT latest.* FROM my_table latest
join (SELECT max(id) as id FROM my_table GROUP 
BY acct_no where created_at = MAX(created_at)) latest2
ON latest.id = latest2.id

答案 2 :(得分:0)

尝试不同的方法。不确定性能影响。但是希望避免自我加入和分组会在性能方面更好。

var cloud = "<img style='position: absolute;right: 0;bottom: 0;' src='"+ Cloud.one + "'>";

Sql Fiddle