SQL - 按行对排序

时间:2011-02-19 23:01:33

标签: sql mysql

有人可以帮我提出一个SQL查询来执行以下操作

按单独的行对排序表,其中对是基于时间戳的连续行。然后按给定对中两行的属性的平均值对所有这些对进行排序。选择第一对/两行。

感谢。我一直困惑于此,我不知道从哪里开始。

示例:

[Timestamp] [Views]
1           23
2           17
3           30
4           5
5           47
6           15

按SUM(视图)ASC

的订单对(时间戳)
[Timestamp] [Views] [(sum)]
3           30       35
4           5
1           23       40
2           17
5           47       62
6           15

3 个答案:

答案 0 :(得分:0)

如果没有大量的行,可以编写一个存储过程,它将遍历底层数据集,将每个连续行对的数据存储在内存变量中,执行平均操作,写出平均值到变量,然后将变量写入临时内存表中的一对行。然后,冲洗并重复......

然后可以按照您希望的任何顺序查询和排序临时表。

答案 1 :(得分:0)

这是我的第一次尝试,我相信它可以改进:

with nosort as (
    select time, views, sumviews
    from #temp t1
    left outer join
        (select min(time) as mintime, sum(views) as sumviews
       from #temp
       group by (time-1)/2) t2 on t2.mintime=t1.time
    where sumviews is not null
)
select t1.time, t1.views, t2.sumviews from #temp t1
join nosort t2 on t1.time=t2.time or t1.time=t2.time+1
order by sumviews

答案 2 :(得分:0)

如果timestamp字段始终在序列中且没有间隙,则此查询应该有效:

SELECT t.Timestamp, t.Views,
  IF(t.Timestamp % 2, t.Views + tPair.Views, NULL) As Sum
FROM tableName t JOIN tableName tPair
  ON IF(t.Timestamp % 2, t.Timestamp + 1, t.Timestamp - 1)  = tPair.Timestamp
ORDER BY t.Views + tPair.Views, t.Timestamp

否则,您需要将结果复制到带有自动增量字段的临时表中,以生成完整序列。