отфильтровать результаты из подзапроса - PullRequest
0 голосов
/ 19 мая 2019

Для следующего запроса:

SELECT t_stamp, sum(t_diff) OVER(ORDER BY t_stamp) AS t_sum
FROM (
    SELECT
        t_stamp
        , getdiffabove(t_stamp - lag(t_stamp) OVER(ORDER BY t_stamp),'1s') AS t_diff
    FROM tstmp
) AS td
WHERE t_stamp >= (SELECT t_stamp FROM td WHERE t_diff > '0ms' ORDER BY t_stamp LIMIT 1)

Набор результатов из подзапроса td содержит столбцы t_stamp и t_diff. Я пытаюсь отфильтровать набор результатов td, чтобы удалить строки до первого значения t_diff выше 0ms. Я получаю ошибку:

ERROR:  relation "td" does not exist

не могу ли я сослаться на td в этой части запроса (предложение WHERE)? Как я могу это исправить?

Примечание. Я хочу избегать использования CTE из-за ограничений CTE в Postgres.

Набор результатов из подзапроса td будет выглядеть следующим образом:

         t_stamp         |    t_diff
-------------------------+--------------
 2013-08-11 07:12:18.204 | 00:00:00
 2013-08-11 07:12:18.455 | 00:00:00
 2013-08-11 07:12:18.705 | 00:00:00
 2013-08-11 07:13:10.82  | 00:00:51.865
 2013-08-11 07:13:11.07  | 00:00:00

Я хочу отфильтровать этот набор результатов так, чтобы строки выше первого ненулевого значения t_diff отфильтровывались. То есть первые три строки в указанном выше наборе результатов будут отфильтрованы. И включающий запрос будет работать с отфильтрованным набором результатов.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Ошибка была вызвана вашим td псевдонимом только для вашего from подзапроса td не может знать псевдоним td в where

Вы можете попробовать использовать cte вместо подзапроса.

with td as (
    SELECT
        t_stamp
        , getdiffabove(t_stamp - lag(t_stamp) OVER(ORDER BY t_stamp),'1s') AS t_diff
    FROM tstmp
)
SELECT t_stamp, sum(t_diff) OVER(ORDER BY t_stamp) AS t_sum
FROM td
WHERE t_stamp >= (
    SELECT t_stamp 
    FROM td 
    WHERE t_diff > '0ms' 
    ORDER BY t_stamp 
    LIMIT 1
)

если вы не хотите использовать cte, вы можете попытаться использовать вложенный подзапрос подзапроса

SELECT t_stamp, sum(t_diff) OVER(ORDER BY t_stamp) AS t_sum
FROM (
    SELECT *,SUM(CASE WHEN t_diff > '0ms' THEN 1 ELSE 0 END) OVER(ORDER BY t_stamp) cnt
    FROM (
        SELECT
            t_stamp
            ,getdiffabove(t_stamp - lag(t_stamp) OVER(ORDER BY t_stamp),'1s') AS t_diff
        FROM tstmp
    ) t
) AS td
WHERE cnt > 0
0 голосов
/ 19 мая 2019

Использовать оконные функции:

SELECT t_stamp, sum(t_diff) OVER (ORDER BY t_stamp) AS t_sum
FROM (SELECT td.*,
             MIN(t_stamp) FILTER (WHERE t_diff > '0ms' OVER () as min_t_stamp
      FROM (SELECT t_stamp,
                   getdiffabove(t_stamp - lag(t_stamp) OVER (ORDER BY t_stamp), '1s') AS t_diff,
            FROM tstmp
           ) td
      ) td
WHERE t_stamp >= min_t_stamp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...