通过多次调用函数创建表以返回记录

杰夫

我有一个函数,可以根据开始和停止时间戳对一系列数据进行一些基本统计:

CREATE OR REPLACE FUNCTION cal(TIMESTAMP, TIMESTAMP, OUT Date_Time timestamp with time zone, OUT avg numeric, OUT stddev numeric, OUT Rstedv_per numeric) 
AS $$
SELECT
    max(datetime) as Date_Time,
    avg(SO2) AS Mean,
    stddev_samp(so2) as STD_DEV,
    stddev_samp(so2)/avg(SO2)*100 as Rstedv_Per
FROM Table43
WHERE datetime > $1 AND datetime < $2;
$$
 LANGUAGE SQL;

这非常适合简单的单选,例如:

select * FROM
 cal('2014-08-02 05:29:00', '2014-08-02 05:32:00')

但是现在我在创建另一个函数甚至是可以组合多次调用“ cal”函数的select语句时遇到了麻烦。例如,我想返回一个包含三个时间段的表。因此,返回值为4列乘3行:

'2014-08-02 05:29:00','2014-08-02 05:32:00'
'2014-08-02 05:35:00','2014-08-02 05:39:00'
'2014-08-02 05:45:00','2014-08-02 05:49:00'
欧文·布兰德斯特

使用VALUES表达式提供输入日期的多行。然后 ...

对于所有版本的Postgres

SELECT cal(a, b)
FROM  (
   VALUES 
      ('2014-08-02 05:29'::timestamp, '2014-08-02 05:32'::timestamp)
    , ('2014-08-02 05:35', '2014-08-02 05:39')
    , ('2014-08-02 05:45', '2014-08-02 05:39')
   ) v(a, b);

您可以将VALUES表达式替换为实际表。

这会将整个行作为单列返回(而不是单个列)。您可以使用进行分解(cal(a, b)).*虽然这有效,但是效率低下。由于Postgres解析器中的弱点,这将导致对该函数进行多次评估。详细说明:

相反,请使用子查询以获得更好的性能:

SELECT (rec).*
FROM  (
    SELECT cal(a, b)
    FROM  (
       VALUES 
          ('2014-08-02 05:29'::timestamp, '2014-08-02 05:32'::timestamp)
        , ('2014-08-02 05:35', '2014-08-02 05:39')
        , ('2014-08-02 05:45', '2014-08-02 05:39')
       ) v(a, b)
   ) sub;

SQL Fiddle(用于pg 8.3演示它在旧版本中的工作)。

由于SELECT列表中的返回集合的函数被某些人皱眉了,因此它们是非标准的SQL。

Postgres 9.3以上

这就是为什么Postgres 9.3推出(符合SQL标准)的主要原因LATERAL JOIN

SELECT f.*
FROM  (
   VALUES 
      ('2014-08-02 05:29'::timestamp, '2014-08-02 05:32'::timestamp)
    , ('2014-08-02 05:35', '2014-08-02 05:39')
    , ('2014-08-02 05:45', '2014-08-02 05:39')
   ) v(a,b)
  , cal(v.a, v.b) f;

LATERAL JOIN隐含在这里,因为从列表参考上表中明确的第二个项目。细节:

当前Postgres 9.3的SQL Fiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过多次连接自身表来创建新列

来自分类Dev

web2py_uuid()通过多次调用返回相同的值?

来自分类Dev

通过多个指针调用成员函数

来自分类Dev

通过多次调用HttpURLConnection.getInputStream()会发生什么

来自分类Dev

通过多次调用HttpURLConnection.getInputStream()会发生什么

来自分类Dev

如何通过多次调用获得程序的性能?

来自分类Dev

列表理解中的函数调用多次返回

来自分类Dev

如何通过多次单击按钮多次创建ASP.NET标签

来自分类Dev

在 r 中通过多个参数调用相同的函数?

来自分类Dev

创建返回表大小的函数

来自分类Dev

传递NULL参数时,通过表函数返回所有记录

来自分类Dev

多次覆盖函数以进行继承调用堆栈日志记录

来自分类Dev

Android-无法通过多次调用queueInsertItems()添加到RemoteMediaPlayer队列

来自分类Dev

Angular 7 with NGRX - 通过多次调用选择器订阅商店属性

来自分类Dev

合并表中的列返回相同记录的多次

来自分类Dev

AngularJS:对服务函数的多次调用返回单独的promise

来自分类Dev

通过多次迭代更新对象数组

来自分类Dev

QSqlTableModel到QML列表通过多次

来自分类Dev

通过创建的HTML代码调用函数

来自分类Dev

尝试通过调用函数从类创建对象

来自分类Dev

表在调用函数时返回nil值

来自分类Dev

Aerospike如何处理通过多个连接创建相同记录的情况?

来自分类Dev

在Odoo v8中,如何在给定表中创建记录时调用一个函数?

来自分类Dev

Java返回码未通过C ++ system()调用正确记录

来自分类Dev

阻止函数被多次调用

来自分类Dev

从模板多次调用的函数

来自分类Dev

函数被多次调用

来自分类Dev

AngularJS函数被调用多次?

来自分类Dev

多次调用onmouseover函数

Related 相关文章

  1. 1

    通过多次连接自身表来创建新列

  2. 2

    web2py_uuid()通过多次调用返回相同的值?

  3. 3

    通过多个指针调用成员函数

  4. 4

    通过多次调用HttpURLConnection.getInputStream()会发生什么

  5. 5

    通过多次调用HttpURLConnection.getInputStream()会发生什么

  6. 6

    如何通过多次调用获得程序的性能?

  7. 7

    列表理解中的函数调用多次返回

  8. 8

    如何通过多次单击按钮多次创建ASP.NET标签

  9. 9

    在 r 中通过多个参数调用相同的函数?

  10. 10

    创建返回表大小的函数

  11. 11

    传递NULL参数时,通过表函数返回所有记录

  12. 12

    多次覆盖函数以进行继承调用堆栈日志记录

  13. 13

    Android-无法通过多次调用queueInsertItems()添加到RemoteMediaPlayer队列

  14. 14

    Angular 7 with NGRX - 通过多次调用选择器订阅商店属性

  15. 15

    合并表中的列返回相同记录的多次

  16. 16

    AngularJS:对服务函数的多次调用返回单独的promise

  17. 17

    通过多次迭代更新对象数组

  18. 18

    QSqlTableModel到QML列表通过多次

  19. 19

    通过创建的HTML代码调用函数

  20. 20

    尝试通过调用函数从类创建对象

  21. 21

    表在调用函数时返回nil值

  22. 22

    Aerospike如何处理通过多个连接创建相同记录的情况?

  23. 23

    在Odoo v8中,如何在给定表中创建记录时调用一个函数?

  24. 24

    Java返回码未通过C ++ system()调用正确记录

  25. 25

    阻止函数被多次调用

  26. 26

    从模板多次调用的函数

  27. 27

    函数被多次调用

  28. 28

    AngularJS函数被调用多次?

  29. 29

    多次调用onmouseover函数

热门标签

归档