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 - 按行对排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用分组行对 SQL 查询进行排序

推力——按键排序两个向量

SQL:按行条目数排序并加入

如何把SQL的表按行进行排序或进行表的行列转换

仅按第二行对 np 二维数组进行排序[重复]

按基本 R 中的重复行对数据框进行排序?