选择具有每天每条记录的创建顺序的行

Posted

技术标签:

【中文标题】选择具有每天每条记录的创建顺序的行【英文标题】:Select rows with each record's creation order per day 【发布时间】:2013-12-06 12:50:34 【问题描述】:

我想从我的表中选择所有行,但还包含该行创建日中每一行的哪个值。

更详细:“当天第一条记录,当天第二条记录”。

例如,假设我有这个带有行的表:

name | created_at
-----------------
john | 2013-02-04 10:00
bob  | 2013-02-04 14:00
dale | 2013-02-05 09:00
lucy | 2013-02-06 11:00
sean | 2013-02-06 13:00
sal  | 2013-02-06 18:00

所以当我选择所有这些值时,我需要的结果是:

name | created_at       | which_record
---------------------------------------
john | 2013-02-04 10:00 | 1
bob  | 2013-02-04 14:00 | 2
dale | 2013-02-05 09:00 | 1
lucy | 2013-02-06 11:00 | 1
sean | 2013-02-06 13:00 | 2
sal  | 2013-02-06 18:00 | 3

有没有办法得到这个which_record 值而不选择值并为每条记录或复杂的子查询再次计算?

我可以选择全部并为每条记录生成这个which_record,或者我可以为每条记录选择以前的记录计数,但我担心如果为每一行运行这个子查询会减慢响应速度。

有什么替代方案或建议吗?

【问题讨论】:

这是您的订单表? 我想知道触发器是否可以在您的情况下完成这项工作?每次您在表格中添加一行时,它都会计算每日订单。 @uvais,我编辑了这个问题,因为“订单”一词看起来很混乱。我的意思是“第一条记录”,“第二条记录”作为“订单”。不像销售订单。 @bh42 你的意思是,将这个值存储在某个地方?我不需要,每次选择行时都需要动态计算。 @kubilay 是的,这就是我的意思。好的,所以这不是你需要的:) 【参考方案1】:

试试这个:

SELECT id, name, created_at, 
   IF(@prev = date(created_at), @s:=@s+1, @s:=1) AS daily_order, 
   @prev:=date(created_at) as dummy
FROM table1, (SELECT @s:= 0, @prev:='') s
ORDER BY created_at

工作演示:http://sqlfiddle.com/#!2/d3ad43/1

检查您的数据以查看性能影响。

【讨论】:

这太棒了,谢谢。如果我必须涉及子查询,这是我的选择: (SELECT COUNT( mt2.id ) + 1 FROM mytable mt2 WHERE DATE( mt2.created_at ) = DATE( mytable.created_at ) AND mytable.@ 987654327@ > mt2.created_at) AS daily_order

以上是关于选择具有每天每条记录的创建顺序的行的主要内容,如果未能解决你的问题,请参考以下文章

以准确的 MAX 顺序获取特定时间戳之间具有 MAX 值的记录

PostgreSQL:根据排序顺序选择最近的行

无论如何,为了提高 SQL 查询的性能,以按标签匹配计数查找具有顺序的行

更改熊猫数据框中随机选择的行的顺序

对于每条记录,还要为记录选择具有最高值的数据[重复]

具有优先顺序的 Asp,net 形式