如何在 SQL 中对差异 <1% 的一列中的值进行分组

尤尼斯

我有各种时间记录,几乎都略有不同(几秒钟)。对我来说,那些非常小的差异意义不大,所以我想将一列中最多相差 1% 的值组合在一起。

有谁知道这是否可能?

例子:

假设我们有这张表:

<style type="text/css">
	table.tableizer-table {
		font-size: 12px;
		border: 1px solid #CCC; 
		font-family: Arial, Helvetica, sans-serif;
	} 
	.tableizer-table td {
		padding: 4px;
		margin: 3px;
		border: 1px solid #CCC;
	}
	.tableizer-table th {
		background-color: #104E8B; 
		color: #FFF;
		font-weight: bold;
	}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>ID</th><th>Time_Sec</th></tr></thead><tbody>
 <tr><td>1</td><td>3000</td></tr>
 <tr><td>1</td><td>3002</td></tr>
 <tr><td>1</td><td>3003</td></tr>
 <tr><td>1</td><td>4455</td></tr>
 <tr><td>1</td><td>4455</td></tr>
 <tr><td>1</td><td>4456</td></tr>
 <tr><td>2</td><td>1000</td></tr>
 <tr><td>2</td><td>1001</td></tr>
 <tr><td>2</td><td>1001</td></tr>
</tbody></table>

我想以此结束:

<style type="text/css">
	table.tableizer-table {
		font-size: 12px;
		border: 1px solid #CCC; 
		font-family: Arial, Helvetica, sans-serif;
	} 
	.tableizer-table td {
		padding: 4px;
		margin: 3px;
		border: 1px solid #CCC;
	}
	.tableizer-table th {
		background-color: #104E8B; 
		color: #FFF;
		font-weight: bold;
	}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>ID</th><th>Group_AVG_Time_Sec</th></tr></thead><tbody>
 <tr><td>1</td><td>3002</td></tr>
 <tr><td>1</td><td>4455</td></tr>
 <tr><td>2</td><td>1001</td></tr>
</tbody></table>

凯厄斯·贾德

这样的事情应该适合你:

SELECT
  ID,
  TRUNC(AVG(time_sec)) as time_sec
FROM
  data
GROUP BY
  ID,
  TRUNC(time_sec/20)

对于在百分比上更有效的东西(并注意这不会输出您的预期结果,但可能会产生)您可以考虑做这样的事情:

SELECT
  id,
  time_sec
FROM
(
  SELECT
    id,
    COALESCE(LAG(id) OVER(order by id), 0) as prev_id,
    time_sec,
    COALESCE(LAG(time_sec) OVER(order by id, time_sec), 0) as prev_time_sec
  FROM
    (
    SELECT
      ID,
      TIME_SEC
    FROM
      data
    )
  )
WHERE
  id != prev_id OR 
  ((time_sec - prev_time_sec) / time_sec) * 100 > 1
ORDER BY
  ID,
  time_sec

这会按 ID 和时间对行进行排序,并且仅显示与上面的行相比 ID 已更改或时间(对于该 ID)与前一时间相差超过 1% 的那些行。然而,并不是“一个组内的所有时间都在每个结束的 1% 之内”,因为这又回到了你如何定义组。本质上,此 SQL 将时间相距 0.9% 的 20 行系列折叠为一行。如果你想要更多的 10 行,其中有 X 行,然后是每 N 行,如果它的时间在第一行的 1% 以内,它被抑制;这更像是一个排名练习,但实施起来可能更简单,即除以某个数字并截断以降低所有时间的精度,如第一个示例所示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据t-sql中的条件对一列的值进行分组?

如何比较按一列分组的SQL中的列值?

如何在一列SQL中存储多个值

如何在SQL中对列进行分组?

如何在一列中对不同的行进行分组?

如何根据另一列中的唯一值对一列中的值进行分组?

如何在SQL中应用group by的同一列中找到差异?

如何在不删除/删除其他重复行的情况下对 1 列中具有重复值的行和另一列中具有不同值的行进行分组?

如何在基于另一列的一列中累积SQL中的值?

如何按 r 中的一列中的不同值进行分组,以便生成密度图?

如何根据行中的特定值和熊猫中的另一列对行进行分组?

SQL Server:如何对一列中的值进行数学计算

如何对熊猫中的每一列进行分组并计算不丢失值的数量

如何用一列的最大值与另一列的最小值之间的差异将一列中的df按Python分组?

如何在一列中获取具有最小值的行,并按另一列进行分组,同时保留其他列?

如何在Sql Server中的列中对选择进行分组

如何对表中的每一列进行排序并在SQL中显示每列中的最高值?

如何在SQL Server中的两列中显示一列值

SQL:如何根据SQL中另一列中的值范围对一列求和?

如何在SQL中获得确切的年份差异

如何在 HiveSQL 中对一列中的数据进行分组并将其分布在另一列中?

如何在SQL中的某一列中基于最大值返回多行

如何在SQL Server中按标题每天选择一列中的最大值

如何在 SQL 中選擇屬於一列 MAX() 值的所有列?

如何在SQL中为一列显示一个值?

如何在DB2 Sql中获取上一列下方下一列的值

Python (pandas) - 如何对一列中的值进行分组,然后根据另一列中的值删除或保留该组

如何在Sql中对表进行分组

如何对行进行分组,在一列中计数,在另一列中求和?