我正在尝试创建一个临时列,它为每组五个结果提供一个数字,以便我可以分组...我在尝试解决如何执行此操作时遇到了很多麻烦。
我不想考虑任何标准,我希望sql将它看到的前五个结果计为GroupNumber 1,接下来的五个结果计为GroupNumber2,依此类推。
以下是一些示例数据 -
Fruits Ordered Date
Orange 4 2015-05-01 00:01:01
Orange 2 2015-05-01 00:01:05
Orange 20 2015-05-01 15:15:00
Apple 30 2015-05-02 16:20:01
Apple 40 2015-05-02 17:01:27
Apple 24 2015-05-02 21:01:33
Apple 19 2015-05-02 18:01:01
Apple 22 2015-05-02 19:00:05
现在,我知道我可以通过将DATETIME列转换为DATE列来对此数据进行分组,但这不是我特别需要的,我不希望在可能的情况下将日期带入其中。
GROUP BY之前的期望结果是这样的 - -
Fruits Ordered Date GroupNumber
Orange 4 2015-05-01 00:01:01 1
Orange 2 2015-05-01 00:01:05 1
Orange 20 2015-05-01 15:15:00 1
Apple 30 2015-05-02 16:20:01 1
Apple 40 2015-05-02 17:01:27 1
Apple 24 2015-05-02 21:01:33 2
Apple 19 2015-05-02 18:01:01 2
Apple 22 2015-05-02 19:00:02 2
非常感谢任何建议!
答案 0 :(得分:0)
您可以使用变量执行此操作:
select s.*,
floor( ((@rn := @rn + 1) - 1) / 5) as group_number
from sample s cross join
(select @rn := 0) params
order by date;
答案 1 :(得分:0)
按日期顺序为每一行提供rownumber
。然后将rownumber除以5并使用ceiling
函数。
<强>查询强>
select t.Fruits,t.Ordered,t.`Date`,
ceiling((t.rn)/5) as Group_Number
from
(
select f.*,
@rownum := @rownum + 1 AS rn
from fruits f,
(select @rownum := 0) r
order by f.`Date`
)t;