SQL - 按行对排序
Posted
技术标签:
【中文标题】SQL - 按行对排序【英文标题】:SQL - Ordering by pairs of rows 【发布时间】:2011-02-19 23:01:33 【问题描述】:谁能帮我想出一个 SQL 查询来执行以下操作
按单独的行对对表进行排序,其中行对是基于时间戳的连续行。然后通过给定对中两行属性的平均值对所有这些对进行排序。选择第一对/两行。
谢谢。我已经困惑了一段时间,不知道从哪里开始。
例子:
[Timestamp] [Views]
1 23
2 17
3 30
4 5
5 47
6 15
SUM(views) ASC 的订单对(时间戳)
[Timestamp] [Views] [(sum)]
3 30 35
4 5
1 23 40
2 17
5 47 62
6 15
【问题讨论】:
请提供样本数据和样本结果。 时间戳字段是否有空格?还是它总是*有从最小值到最大值的每个数字? 是 - 假设时间戳字段总是有一个值 【参考方案1】:如果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
否则,您需要将结果复制到具有自动增量字段的临时表中以生成完整序列。
【讨论】:
这个的实际使用不涉及时间戳字段总是在一个序列中,所以我会尝试使用临时表【参考方案2】:如果您没有大量的行,您可以编写一个遍历底层数据集的存储过程,将每对连续行的数据存储在内存变量中,执行平均操作,写入平均值到变量,然后将变量写入临时内存表中的一对行。然后,冲洗并重复...
然后可以按照您希望的任何顺序查询和排序该临时表。
【讨论】:
【参考方案3】:这是我的第一次尝试,我相信它可以改进:
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
【讨论】:
以上是关于SQL - 按行对排序的主要内容,如果未能解决你的问题,请参考以下文章