SQL:任何直接的方式来订购结果FIRST,然后按另一列排序?

amn*_*amn 5 mysql sql database group-by sql-order-by

我在SQL中看到,GROUP BY必须在ORDER BY表达式之前.这是否意味着在分组后完成排序会丢弃相同的行/列?

因为我似乎需要首先按时间戳列A排序行,然后丢弃列A中具有相同值的行.不确定如何完成此操作...

我正在使用MySQL 5.1.41

create table
(
    A int,
    B timestamp
)
Run Code Online (Sandbox Code Playgroud)

数据可能是:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  1  |  yesterday            |
|  2  |  yesterday            |
|  2  |  tomorrow             |
+-----+-----------------------+
Run Code Online (Sandbox Code Playgroud)

我的目标是:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  2  |  tomorrow             |
+-----+-----------------------+
Run Code Online (Sandbox Code Playgroud)

基本上,我希望列B中具有最新时间戳的行(想想ORDER BY),并且列A中的每个值只有一行(想想DISTINCT或GROUP BY).

我的实际项目详情,如果您需要这些:

在现实生活中,我有两张桌子 - userspayment_receipts.

create table users
(
    phone_nr int(10) unsigned not null,
    primary key (phone_nr)
)

create table payment_receipts
(
    phone_nr int(10) unsigned not null,
    payed_ts timestamp default current_timestamp not null,
    payed_until_ts timestamp not null,
    primary key (phone_nr, payed_ts, payed_until_ts)
)
Run Code Online (Sandbox Code Playgroud)

这些表可能包含其他列,我省略了IMO与此无关的所有内容.作为移动支付方案的一部分,我必须定期向移动蜂窝网络中的用户发送短信,具体取决于付款是否到期.发送短信时实现付款,这是高级税.我保留了所有付款的记录payment_receipts表,用于记账,模拟真实的商店,买方和卖方都获得购买收据的副本,以供参考.此表存储每张收据的(卖家)副本.客户收据是收到的SMS本身.每次发送短信(从而完成付款)时,表格都会插入一张收据记录,说明付款的人,何时以及"直到何时".为了解释后者,想象一下订阅服务,但是它会无限期地跨越直到用户明确选择退出,此时用户记录被删除.进行付款时,提前一个月,所以作为一项规则,不同的之间payed_tspayed_until_ts值得的时间为30天.

当然,我有一个每天执行的批处理作业,需要选择每月到期的用户列表,作为自动续订的一部分.为了前面的链接这虚拟实例,电话号码列phone_nrapayed_until_tsb的,但在实际的代码有两个表,这给我带来了以下行为及其含义:当用户记录被删除,接收遗体,对于簿记.因此,我不仅需要按日期对付款进行分组并丢弃除最新付款收据日期以外的所有付款,我还需要注意不要选择不再有匹配用户记录的收据.

我正在解决通过查找具有最新payed_until_ts值的收据(在大多数情况下每个电话号码将有几个收据)来选择到期付款的记录的问题,phone_nr并且在这些行中我还需要只留下那些电话号码其中payed_until_ts早于批处理作业执行的时间.我循环遍历这些号码的列表并发送付款,为每个发送的短信存储新的收据,其中包含的payed_ts位置now()payed_until_ts位置now() + interval 30 days.

Mik*_*rov 9

Select a,b from (select a,b from table order by b) as c group by a;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是公认的答案,但它是错误的,因为它使用了*明确*记录的MySQL扩展无法工作.扩展名是使用`select`中不在`group by`中的列(参见http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html). (4认同)
  • 这个查询中有很多错误,我甚至不想描述它... (3认同)

pax*_*blo 5

是的,首先完成分组,它会影响单个,select而排序会影响a中所有select语句的所有结果union,例如:

select a, 'max', max(b) from tbl group by a
union all select a, 'min', min(b) from tbl group by a
order by 1, 2
Run Code Online (Sandbox Code Playgroud)

(使用字段编号,order by因为我无法为列我的名字而烦恼).每个group by都只影响它select,order by影响组合结果集.

您似乎可以通过以下方式实现目标:

select A, max(B) from tbl group by A
Run Code Online (Sandbox Code Playgroud)

这使用max聚合函数基本上进行组前排序(它实际上并没有在任何合适的DBMS中对其进行排序,而是只选择合适的索引中的最大值(如果可用)).