0

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

请注意,两个系列的 Flow 值范围从 0 到 5000,以 10 递增。另请注意,Head 值大部分为空,除非数据点可用。(通常,数据点的 Flow 值不会完全落在可被 10 整除的数字上,但如果是这样,那对我遇到的问题应该没关系。)

所以,这就是我遇到的问题。当我生成折线图时,一切看起来都很好,除了那些数据点具有较低流量值的资产。对于这些,0 到 5000 的固定 X 轴范围不会产生漂亮的折线图,因为曲线在 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 语法编写。

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

4

2 回答 2

1

我在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;
于 2016-06-02T16:34:25.187 回答
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

但取决于订单的细节

于 2016-06-02T16:41:14.620 回答