我有一个如下所示的 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/