user231744 Asked: 2023-12-13 22:10:17 +0800 CST2023-12-13 22:10:17 +0800 CST 2023-12-13 22:10:17 +0800 CST SQL 查询根据最大值对数据进行排序 772 这是我的数据集: 对于任何给定的“时间”(基本上每秒),大约会记录 3 到 5 个“小区 ID”。我需要知道的是每个时间集(秒)接收到的最大“参考信号_接收功率”的“小区 ID”。 例如,在第一个时间设置 10:32:25,我们看到四个“小区 ID”:420、214、284 和 323,并且很容易看出最大“参考信号_接收功率”为 -87.38第一个时间设置。现在我们可以创建一个 SQL 查询来为我们执行此操作吗? 我有数小时的数据,因此非常需要一个程序化的解决方案。 mysql 1 个回答 Voted Best Answer J.D. 2023-12-13T22:42:10+08:002023-12-13T22:42:10+08:00 您正在寻找的是一个窗口函数。一些常见的有ROW_NUMBER()、RANK()、 和DENSE_RANK()。但我认为最简单的解决方案是使用FIRST_VALUE()窗口函数,如下所示: SELECT DISTINCT [time], FIRST_VALUE([cell id]) OVER ( PARTITION BY [time] ORDER BY [ref signal _ received power] DESC ) FROM YourTable; 窗口函数的作用FIRST_VALUE()是按要分区的字段对行进行分组cell id,并按 order by 子句中的字段对这些分区组内的行进行排序,并返回传递给函数的字段的第一个值(在本例中) )来自每个行分区组。time然后,distinct 关键字将行折叠为每个和第一个唯一的行cell id。 请注意,如果您的数据跨越多个日期,并且您实际上希望cell id每个不同的日期和时间都有一个单独的数据,那么您可以将该date字段添加到上面的查询中,如下所示以适当地将其分解: SELECT DISTINCT [date], [time], FIRST_VALUE([cell id]) OVER ( PARTITION BY [date], [time] ORDER BY [ref signal _ received power] DESC ) FROM YourTable; 另外,为了良好的可管理性和可读性,并减少语法错误的可能性,您应该在命名列时不使用特殊字符(例如空格),并且不要使用保留字(例如数据类型date和time)作为名称。
您正在寻找的是一个窗口函数。一些常见的有
ROW_NUMBER()
、RANK()
、 和DENSE_RANK()
。但我认为最简单的解决方案是使用FIRST_VALUE()
窗口函数,如下所示:窗口函数的作用
FIRST_VALUE()
是按要分区的字段对行进行分组cell id
,并按 order by 子句中的字段对这些分区组内的行进行排序,并返回传递给函数的字段的第一个值(在本例中) )来自每个行分区组。time
然后,distinct 关键字将行折叠为每个和第一个唯一的行cell id
。请注意,如果您的数据跨越多个日期,并且您实际上希望
cell id
每个不同的日期和时间都有一个单独的数据,那么您可以将该date
字段添加到上面的查询中,如下所示以适当地将其分解:另外,为了良好的可管理性和可读性,并减少语法错误的可能性,您应该在命名列时不使用特殊字符(例如空格),并且不要使用保留字(例如数据类型
date
和time
)作为名称。