【问题标题】:Fetching last good values based on the condition with SQL query?使用 SQL 查询根据条件获取最后一个好的值?
【发布时间】:2013-07-29 09:45:47
【问题描述】:

我需要对下表进行查询,输出如下所述

我有列Timestamp, A, B, C, D 并且,样本数据如下

 Timestamp       A   B    C   D
------------------------------
20-7-2013:2:15   1  360   1  -5
20-7-2013:7:15   2  360   E  -3
21-7-2013:9:15   N  360   E  -6
21-7-2013:10:15  N  360   E  -8
22-7-2013:11:15  N  360   E  -7

首先,我需要检查列A最后记录值是(NULL or E or -ve)值,如果这三个是,那么我需要得到最后一个良好的起息日(在A列的情况下输出应该是“20-7-2013:7:15”)取决于条件(每列介于 0 到 360、>0、-5 到 +5 之间)。对 A 到 Z 列也必须这样做。最终输出应该是

ColumnName      Time
------------------------- 
    A      20-7-2013:7:15

更新:对于列 A,输出应为:20-7-2013:7:15(因为它是上一个 NULL 的直接好值); B列可以忽略,因为最后一个值为360并且满足条件;对于 C 列,输出应该是: 20-7-2013:2:15 因为条件是 E 错误之前的最后一个好值,并且 D 列输出应该是 20-7-2013:7:15 因为它满足条件(值介于 -5 和 +5 之间)...请帮助

【问题讨论】:

  • 正如你所说的The same has to be done for the columns A to Z. And the Final output should be,还需要做什么?
  • 感谢您的回复,我的意思是,我获取列 A 的输出的方式与条件相同,我也需要在输出中获取其余列的输出
  • 你能发布一个你迄今为止尝试过的查询
  • 很抱歉,我还没有构建查询..正在尝试..如果您能提供帮助,我们将不胜感激
  • 您在帖子中提到Column A last record value表示最旧记录还是最新记录?

标签: sql sql-server sql-server-2008 plsqldeveloper


【解决方案1】:

如果不同的列对“好价值”有不同的标准,我只需依次查询每一列,然后UNION它们一起

例如

SELECT TOP 1 'A' AS ColumnName, Timestamp AS [Time] FROM <table>
WHERE A IS NOT NULL AND ISNUMERIC(A) = 1 AND A >= 0
ORDER BY Timestamp DESC
UNION
SELECT TOP 1 'B', Timestamp FROM <table>
WHERE B IS NOT NULL AND ISNUMERIC(B) = 1 AND B BETWEEN 0 AND 360 
ORDER BY Timestamp DESC
UNION
...

更新: 从下面的 cmets 中,我想我明白这里发生了什么。 听起来每列都有一些条件要检查,如果最终日期满足条件,也应该排除。我建议围绕列查询的UNION 进行外部查询,以删除满足最后一个值的情况。

更新 2

SELECT * FROM (
    SELECT TOP 1 'A' AS ColumnName, Timestamp AS [Time] FROM <table>
    WHERE A IS NOT NULL AND ISNUMERIC(A) = 1 AND A BETWEEN 0 AND 360
    ORDER BY Timestamp DESC
    UNION
    SELECT TOP 1 'B', Timestamp FROM <table>
    WHERE B IS NOT NULL AND ISNUMERIC(B) = 1 AND B > 0
    ORDER BY Timestamp DESC
    UNION
    SELECT TOP 1 'C', Timestamp FROM <table>
    WHERE C IS NOT NULL AND ISNUMERIC(C) = 1 AND C BETWEEN -5 AND 5
    ORDER BY Timestamp DESC
    UNION
    SELECT TOP 1 'D', Timestamp FROM <table>
    WHERE D IS NOT NULL AND ISNUMERIC(D) = 1 AND D BETWEEN -5 AND 5
    ORDER BY Timestamp DESC
) Cols
WHERE [Time] < ( SELECT TOP 1 Timestamp FROM <table> ORDER BY Timestamp DESC )

【讨论】:

  • 你能帮我在满足条件的情况下获得我想要的 1 列 A 的确切输出(为 NULL 或 E 或负值),然后在条件下获取良好的价值日期(要么在 0 到 360 或 >0 或 -5 到 +5) 之间?.. 我将复制所有带有联合的列...我没有从上述查询中获得 A 列的输出
  • 这三个条件是否适用于同一列?或者是否存在跨多个列的条件以获得正确的 A? >0 隐含在 0 到 360 之间,而 -5 到 5 与一半时间相矛盾
  • 嗯,条件适用于每一列,如果 A 列的值落在 0 到 360 之间,我们需要使用此条件,如果 B 列的值为负值,那么我们需要使用负条件。跨度>
  • @RJ1990: 如果列的最后一行值不在“ NULL 或 E 或负值之间),如果为负,我们有条件说它应该在 -5 到 +5 之间,如果列的最后一个值满足上述条件,则只显示输出,如果不满足这 3 个条件,则应忽略该列的输出。请帮助
  • @Reyaz:现在检查this。如果不是答案,请提供一些详细信息和常规术语,而不是您的特定术语,例如 last row value for column is not falls in between
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多