[英]How to know if all NULL for a column in all rows of result recordset in PHP?
[英]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.