当前位置: 首页 > 面试题库 >

是否有[直接]方式用SQL对结果“首先”,“然后”按另一列进行排序?

佟和平
2023-03-14
问题内容

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

因为我似乎需要首先按时间戳记列A对行进行排序,然后才丢弃列A中具有相同值的行。不知道如何完成此操作…

我正在使用MySQL 5.1.41

create table
(
    A int,
    B timestamp
)

数据可以是:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  1  |  yesterday            |
|  2  |  yesterday            |
|  2  |  tomorrow             |
+-----+-----------------------+

我想要的结果是:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  2  |  tomorrow             |
+-----+-----------------------+

基本上,我想要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)
)

这些表可能包括其他列,在此我忽略了与IMO不相关的所有内容。作为移动支付方案的一部分,我必须定期通过移动蜂窝网络向用户发送SMS,具体取决于支付是否到期。付款是在发送SMS时实现的,需要缴纳附加税。我会保留所有通过以下方式完成的付款的记录:payment_receipts表格,用于记账,模拟一个真实的商店,买方和卖方均会获得购买收据的副本,以供参考。该表存储了我每张收据的(卖方)副本。客户收据就是收到的SMS本身。每次发送SMS(从而完成付款)时,都会在该表中插入一条收据记录,指明何时付款以及何时付款。为了解释后者,请想象一个订阅服务,但是它无限期地进行直到用户明确选择退出为止,此时用户记录将被删除。进行付款时,提前一个月,所以作为一项规则,不同的之间payed_tspayed_until_ts30天的时间。

自然,我有一个每天执行的批处理作业,需要选择作为自动订阅续订的一部分应每月付款的用户列表。要将其链接到前面的虚拟示例,电话号码列phone_nrapayed_until_tsb,但是在实际代码中有两个表,这使我想到以下行为及其含义:删除用户记录时,收据仍保留,用于簿记。因此,不仅需要按日期对付款进行分组并丢弃所有付款,而且还需要丢弃最新的付款收据日期,而且还需要当心不要选择不再有匹配的用户记录的收据。

I am solving the problem of selecting records that are due payment by finding
the receipts with the latest payed_until_ts value (as in most cases there
will be several receipts for each phone number) for each phone_nr and out of
those rows I further need to leave only those phone_numbers where the
payed_until_ts is earlier than the time the batch job executes. I loop over
the list of these numbers and send out payments, storing a new receipt for
each sent SMS, where payed_ts is now() and payed_until_ts is now() + interval 30 days.


问题答案:
Select a,b from (select a,b from table order by b) as c group by a;


 类似资料:
  • 问题内容: 我只想使用Collections.sort或Arrays.sort来先按x然后按y排序点列表(类Point)。 我有一个像这样实现Comparable的Ponto类: 但是现在我也想在x之后按y排序。 如何通过修改上面的代码来做到这一点?还是这是一种更好且“干净”的方式?我还使用了将此代码传递给C ++,在其中使用等效的等效方法创建了一个名为Point的结构。 问题答案: 将相同的比较

  • 问题内容: 我在Python中有两个列表 我想对第一个列表进行排序,并使用结果对第二个列表进行排序。 换句话说,结果应为: 我知道如何分别对每个列表进行排序,但是如何使用对另一个列表进行排序所产生的索引排列来对一个列表进行排列呢? 问题答案: 施瓦兹变换

  • 我已经能够得到这个数组,因此它是使用' m '排序的,但是结果是按保护顺序排序的——因为所有包含' m '的字符串都在末尾。 我的打印输出显示:; 我考虑过使用indexOf(),但我还没能找到一种方法让它工作。 非常感谢您的建议!

  • 问题内容: 我目前正在创建一种排序方法,该方法由mysql查询的值组成。 这是数组的简要视图: 我已经成功地基于数字id值进行了正常的排序,但是我想按“国家/地区”字段的内容对数组进行排序(如果在这种情况下包含设置的字符串和国家/地区代码),然后通过id字段。 以下代码段是我的第一个想法,但我不知道如何将其合并到工作功能中: 你会怎么做? 谢谢! 不幸的是,我真的一无所获。 这是我目前拥有的东西,

  • 问题内容: 我在使用Elasticsearch查询时遇到问题。我希望能够对结果进行排序,但是elasticsearch忽略了排序标签。这是我的查询: 但是,当我删除查询部分并仅发送排序标签时,它就可以工作。谁能指出正确的方法? 我还尝试了以下查询,这是我所拥有的完整查询: 设定值 对应 提前致谢! 问题答案: 文档中的 “标题” 字段是一个 分析的 字符串字段,也是一个多值字段,这意味着Elast

  • 问题内容: 我有一个庞大的产品数据库,每个星期天,我的脚本都会激活50个新产品。问题是,根据我脚本中的某些规则,我发现我应该优先激活一些产品。(以您的示例为例,它应该始终优先激活其中名称为“ hello kitty”和“ meshuggah”的产品,然后再进行其他操作) 我的数据库表包含有关产品的信息和唯一ID。可以说脚本找到了这些ID中的5个,标题中有hello kitty。 因此,我该如何进行