Sql 浏览子列,但放弃一些

Sql 浏览子列,但放弃一些,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我的PostgreSQL数据库中有一个表或视图,希望执行以下操作: 查询表并在我的应用程序中为函数提供查询中的后续n元组行,但只提供满足某些条件的行。我可以使用游标列出n元组列表,但我不知道如何在数据库级别进行条件检查 例如,查询返回: 3 2 4 2 0 1 4 6 2 我想要偶数的三倍。在这里,它们是: (2,4,2) (4,2,0) (4,6,2) 显然,我不能从查询结果中丢弃奇数。相反,使用游标,以类似方式返回数组的查询也是可以接受的解决方案,但我不知道如何使用它们来实现这一点 当然

我的PostgreSQL数据库中有一个表或视图,希望执行以下操作: 查询表并在我的应用程序中为函数提供查询中的后续n元组行,但只提供满足某些条件的行。我可以使用游标列出n元组列表,但我不知道如何在数据库级别进行条件检查

例如,查询返回:

3
2
4
2
0
1
4
6
2
我想要偶数的三倍。在这里,它们是:

(2,4,2) (4,2,0) (4,6,2)
显然,我不能从查询结果中丢弃奇数。相反,使用游标,以类似方式返回数组的查询也是可以接受的解决方案,但我不知道如何使用它们来实现这一点

当然,我可以在应用程序级别进行检查,但我认为在数据库级别进行检查会更干净。有可能吗?

使用:

没有自然的行顺序-假设您希望在示例中按tbl_id排序。

与:

没有自然的行顺序-假设您希望在示例中按tbl_id排序。


您还可以为此使用数组聚合,而不是使用滞后:


不知道这是好是坏,还是与Erwin的答案相同,只是为了完整性而放进去。

您也可以使用数组聚合,而不是使用滞后:


不知道这是好是坏,还是与欧文的答案相同,只是为了完整性而放进去。

您只需要三个连续的记录,所有记录的列值都是偶数?顺便说一句:你不需要光标。这只是一个简单的例子,我不想详细介绍我的表格,但基本上,是的。一般来说,我希望对每n个连续行计算一个谓词,并且仅当谓词的计算结果为true时才返回它们。看看窗口函数,特别是滞后、超前和排名。您只需要三个连续记录,它们的列都具有偶数值?顺便说一句:你不需要光标。这只是一个简单的例子,我不想详细介绍我的表格,但基本上,是的。一般来说,我希望对每n个连续行计算一个谓词,并且仅当谓词的计算结果为true时才返回它们。看看窗口函数,特别是滞后、超前和排名。窗口函数,这就是我需要的!我不知道这样的事情存在。非常感谢你!嗯,我告诉过你它们的存在,所以你可以知道。窗口函数,这就是我需要的!我不知道这样的事情存在。非常感谢你!我告诉过你它们是存在的,所以你应该知道。PostgreSQL中的EXPLAIN命令显示它们是相同的。仅针对sompleteness-:长数组的语法当然更短。PostgreSQL中的EXPLAIN命令显示它们是相同的。仅针对sompleteness-:长数组的语法肯定更短。
SELECT *
FROM  (
  SELECT tbl_id, i AS i1
       , lead(i)    OVER (ORDER BY tbl_id) AS i2
       , lead(i, 2) OVER (ORDER BY tbl_id) AS i3
  FROM   tbl
  ) sub
WHERE  i1%2 = 0
AND    i2%2 = 0
AND    i3%2 = 0;
SELECT
  a[1] a1, a[2] a2, a[3] a3
FROM (
  SELECT
    array_agg(i) OVER (ORDER BY tbl_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
  FROM
    tbl
) x(a)
WHERE a[1] % 2 = 0 AND a[2] % 2 = 0 AND a[3] % 2 = 0;