有人可以帮我提出一个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
答案 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
否则,您需要将结果复制到带有自动增量字段的临时表中,以生成完整序列。