繁体   English   中英

如何在SQL查询结果中过滤掉所有列=空行超过最后一列!=空行,按偏移量

[英]How to Filter Out All column = null Rows Past the Last column != null Row, by an Offset, in the Result of a SQL Query

我有一个看起来像这样的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列拖放到Legend。 对于上面的示例表,这将产生两条曲线A和B。

请注意,两个系列的“流量”值都在0到5000之间,以10为增量。 还要注意,Head值大多为空,除非有数据点可用。 (通常,数据点的“流量”值不完全落在可以被10整除的数字上,但是如果确实如此,则对于我遇到的问题不重要。)

所以,这就是我的问题。 当我生成折线图时,除了那些数据点的Flow值较低的资产外,其他一切看起来都不错。 对于这些,固定的X轴范围从0到5000不会产生美观的折线图,因为曲线是相对于Y轴向上弯曲的。 (顺便说一下,Y轴看起来很好,因为折线图元素会自动缩放其Y轴。)

我知道解决此问题需要发生什么。 我需要能够向该表编写一个SQL查询,以过滤掉Head = null之后的所有行,而不管最后一个Head!= null行是什么。 最好有一个偏移量,以便直到最后Head!= null行之后的几行才开始中断。 这会使图表看起来更好。

对于我上面给出的示例表,如果您假设Flow = 39.42&Head = 60.1行是表中的最后一个Head!=空行,则该表的一个很好的查询结果将是以下内容,其中排除了所有超出的行数(偏移量为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语法编写SQL查询。

这样的查询结果会切断所有不必要的数据,从而可以绘制精美的图形! 感谢您的帮助!

我在SQL SERVER中使此示例相同的代码应在oracle中工作

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

3 * 10可偏移三行。

如果您想要更通用,更可扩展的功能,可以使用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;

可能将所有低于临界值的东西合并,然后将其合并到高于临界值的所有东西,但按流的顺序进行排序,且限制为10:

SELECT *
FROM sometable
WHERE flow <= 
(
    SELECT MAX(flow)
    FROM sometable 
    WHERE head IS NOT NULL
)
UNION
SELECT flow, head, series_name
FROM
(
    SELECT flow, head, series_name
    FROM sometable
    WHERE flow > 
    (
        SELECT MAX(flow)
        FROM sometable 
        WHERE head IS NOT NULL
    )
    ORDER BY flow
    LIMIT 10
) sub1

但是要看订单的细节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM