如何筛选出所有column = null Rows经过Last列!= null在SQL查询的结果中按行偏移行

时间:2016-06-02 16:23:14

标签: 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 vs Head。这很好用,因为我可以将Flow列拖放到X轴中,将Head列拖放到Y轴中,将Series_Name列拖放到Legend中。对于上面的示例表,这会生成两条曲线A和B.

请注意,对于两个系列,Flow值的范围为0到5000,递增10。另请注意,Head值大多为null,除非数据点可用。 (通常情况下,数据点和流量值不会完全落在可被10整除的数字上,但如果它们存在,则对我遇到的问题不重要。)

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

我知道解决这个问题需要做些什么。我需要能够向这个表写一个SQL查询,过滤掉Head = null的所有行,不管最后一个Head!= null行是什么。有一个偏移量也是很好的,这样它就不会开始切断直到最后一个Head!= null行的几行。这将使图表看起来更好。

对于上面给出的示例表,如果您假设Flow = 39.42& Head = 60.1 row是表中的最后一个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语法编写。

这种查询结果可以切断所有不必要的数据,可以很好地绘制图形!我很感激帮助!

2 个答案:

答案 0 :(得分:1)

我在 SQL SERVER 中创建此示例相同的代码应该在oracle中运行

JSON.parse
  

3 * 10以抵消另外三行。

如果您想要更通用和可扩展的内容,可以使用SELECT * from Events WHERE Flow <= (SELECT max(Flow) + 3*10 FROM Events WHERE [HEAD] IS NOT NULL) ,但需要谨慎使用row_number()

order by

答案 1 :(得分:0)

可能会将所有内容都放在切断点以下,然后将其与截止点以上的所有内容联合起来,但是按流量排序并应用限制为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

但取决于订单的细节