mysql - 如何在 SQL 查询结果中按偏移量过滤掉最后一列之后的所有列 = null 行!= null 行

标签 mysql sql oracle native-sql

我有一个如下所示的 SQL 表:

Flow             Head            Series_Name

0                null            A           
0                null            B
10               null            A
10               null            B
20               null            A
22.5             88              B
20               null            B
30               null            A
30               null            B
39.42            60.1            A
40               null            A
40               null            B
etc...           etc...          etc...
5000             null            A
5000             null            B

基本上,该表的想法是能够使用它在 Cognos Report Studio 的折线图元素中绘制流量与水头的关系。这效果很好,因为我可以将 Flow 列拖放到 X 轴,将 Head 列拖放到 Y 轴,将 Series_Name 列拖放到图例中。对于上面的示例表,这会生成两条曲线 A 和 B。

请注意,对于两个系列,流量值的范围都是从 0 到 5000,增量为 10。另请注意,除非数据点可用,否则 Head 值大多为空。 (通常,数据点的 Flow 值并不完全落在可被 10 整除的数字上,但如果确实如此,对于我遇到的问题来说应该不重要。)

所以,这就是我遇到的问题。当我生成折线图时,一切看起来都很棒,除了那些数据点具有较低流量值的 Assets 。对于这些,固定的 X 轴范围 0 到 5000 不会产生漂亮的折线图,因为曲线相对于 Y 轴被挤压。 (顺便说一句,Y 轴看起来很好,因为折线图元素会自动缩放其 Y 轴。)

我知道需要采取什么措施来解决这个问题。我需要能够向该表写入一个 SQL 查询,过滤掉所有带有 Head = null 的行,无论最后一个 Head != null 行是什么。最好有一个偏移量,这样直到最后一个 Head != null 行过去几行后它才开始被切断。这将使图表看起来更好。

对于我上面给出的示例表,如果您假设 Flow = 39.42 & Head = 60.1 行是表中最后一个 Head != null 行,那么该表的一个不错的查询结果将如下所示,其中排除其后面的所有行(偏移 6 行):

Flow             Head            Series_Name 

0                null            A           
0                null            B
10               null            A
10               null            B
20               null            A
22.5             88              B
20               null            B
30               null            A
30               null            B
39.42            60.1            A
40               null            A
40               null            B
50               null            A
50               null            B
60               null            A
60               null            B

我知道这需要在 SELECT 语句末尾使用 WHERE 子句,但我不确定如何表达这样的子句,以便仅排除属于查询结果不必要的后半部分的行。 SQL查询需要用Native SQL语法编写。

这种查询结果会切断所有不必要的数据,图表会很漂亮!我感谢您的帮助!

最佳答案

我在SQL SERVER中做了这个例子 相同的代码应该可以在 Oracle 中运行

SELECT *
from Events
WHERE Flow <= (SELECT max(Flow) + 3*10 FROM Events WHERE [HEAD] IS NOT NULL)

3*10 to offset three more rows.

如果您想要更通用和可扩展的东西,您可以使用row_number(),但需要小心order by

WITH addRow_id as (
     SELECT *, ROW_NUMBER() OVER ( ORDER BY [Flow], [Series_Name]) as rn
     FROM Events
),
lastID as (
     SELECT MAX(rn) as last_row
     FROM addRow_id
     WHERE [HEAD] IS NOT NULL
)
SELECT *
FROM addRow_id A
CROSS JOIN lastID L
WHERE A.rn <= L.last_row + 6;

关于mysql - 如何在 SQL 查询结果中按偏移量过滤掉最后一列之后的所有列 = null 行!= null 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37597245/

相关文章:

php - PDO Prepared stament while in a loop

sql - 通过查询连接

mysql - 根据另一个表中的列更新表

mysql - 查询错误#1241

mysql - 有没有办法优化我的 NOT IN 查询以加快速度?

php - MySQL 表条目不显示

SQL 甲骨文 : How to replace a character by its HEX value

sql - 非贪婪的 Oracle SQL regexp_replace

sql - 在哪里可以找到预定义 Oracle pl/SQL 异常的完整列表?

mysql - 在mysql中准备一条Prepare语句并在其中使用convert_tz