SQL - 按行对排序

3

有人能帮我想出一个SQL查询来完成以下操作吗?

按照时间戳连续的一对行排序表格。然后按照给定一对行中两个行的属性的平均值排序所有这些对。选择第一对/两行。

谢谢。我已经思考了一段时间,不确定从哪里开始。

例子:

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

按SUM(views)的升序排序时间戳对

[Timestamp] [Views] [(sum)]
3           30       35
4           5
1           23       40
2           17
5           47       62
6           15

1
请提供样本数据和样本结果。 - Oded
时间戳字段中是否存在任何间隙?或者它是否总是包含从最小值到最大值的每个数字? - The Scrum Meister
是的 - 假设时间戳字段始终有值 - user545139
3个回答

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

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

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

实际使用中并不涉及始终按顺序排列的时间戳字段,因此我将尝试使用临时表。 - user545139

0

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

然后,可以查询和按任何顺序排序该临时表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接