PostgreSQLgenerate_series()以SQL函数作为参数

2023-11-30

我有一个名为的 SQL 函数get_forecast_history(integer,integer)这需要两个参数,一个月和一年。该函数返回使用以下命令创建的自定义类型:

CREATE TYPE fcholder AS (y integer, m integer, product varchar, actual real);

函数定义的第一行是:

CREATE OR REPLACE FUNCTION get_forecast_history(integer, integer)
  RETURNS SETOF fcholder AS $$

Calling:

SELECT * FROM get_forecast_history(10, 2011);

例如,生成下表(函数的结果类型是表,即SETOF):



  y   m product  actual
---- -- -------- ------
2011 10 Product1  29
2011 10 Product2  10
2011 10 Product3  8
2011 10 Product4  0
2011 10 Product5  2
  

等(共约30种产品)。这是给定月份的历史记录。

我还有另一个生成一系列月份的查询:

SELECT to_char(DATE '2008-01-01'
            + (interval '1 month' * generate_series(0,57)), 'YYYY-MM-DD') AS ym

哪些产品的列表如下:



ym
----------
2008-01-01
2008-02-01
2008-03-01
2008-04-01
...
2011-10-01
  

我需要以某种方式LEFT JOIN的结果generate_series通过取以下结果,对上述函数进行年/月组合generate_series并将它们作为参数传递给函数。这样我就可以得到函数的结果,但是对于每个年/月的组合generate_series。此时我被困住了。

我正在使用 PostgreSQL 8.3.14。


你想要做的事情可以像这样工作:

编辑附加信息

CREATE OR REPLACE FUNCTION f_products_per_month()
  RETURNS SETOF fcholder AS
$BODY$
DECLARE
    r fcholder;
BEGIN

FOR r.y, r.m IN
    SELECT to_char(x, 'YYYY')::int4  -- AS y
          ,to_char(x, 'MM')::int4    -- AS m
    FROM  (SELECT '2008-01-01 0:0'::timestamp
        + (interval '1 month' * generate_series(0,57)) AS x) x
LOOP
    RETURN QUERY
    SELECT *    -- use '*' in this case to stay in sync
    FROM   get_forecast_history(r.m, r.y);

    IF NOT FOUND THEN
       RETURN NEXT r;
    END IF;
END LOOP;

END;
$BODY$
  LANGUAGE plpgsql;

Call:

SELECT * FROM f_products_per_month();

主要观点:

  • 最终编辑包括几个月没有产品的空行。
  • 您写了“LEFT JOIN”,但这不是它的工作原理。
  • 有几种方法可以做到这一点,但是RETURN QUERY是最优雅的。
  • 使用与函数 get_forecast_history() 使用的相同的返回类型。
  • 通过对列名进行表限定来避免与 OUT 参数的命名冲突(在最终版本中不再适用)。
  • 不要使用DATE '2008-01-01',像我一样使用时间戳,无论如何它都必须转换为 to_char() 。更少的铸造,性能更好(在这种情况下这并不重要)。
  • '2008-01-01 0:0'::timestamp and timestamp '2008-01-01 0:0'只是两个语法变体做同样的事情。
  • 对于旧版本的 PostgreSQL,默认情况下不安装语言 plpgsql。您可能需要发出CREATE LANGUAGE plpgsql;一旦进入您的数据库。看手册在这里.

如果需要,您可以将两个函数简化为一个查询或函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQLgenerate_series()以SQL函数作为参数 的相关文章

随机推荐

  • 在终端上切换 GitHub 帐户时遇到问题

    自从我将任何东西推送到 GitHub 以来已经有一段时间了 我最初在计算机上设置了帐户 一切运行良好 然后我将我的帐户更改为客户的帐户 这样我就可以将代码推送到他们的私人存储库 已经有一段时间了 现在我要改回旧帐户 但遇到了麻烦 我生成了一
  • 当上游有事件时,为什么有一个可用的“事件”变量而没有定义?

    我今天偶然发现了一个奇怪的行为 基本上 我有一个绑定到 knockout js 单击事件的函数 该函数利用了淘汰事件 但没有明确将其作为参数 this myClickHandler function console log event ev
  • 从子字符串中包含特定字符的字符串中提取单词

    在 MS Excel 中 我想使用公式从文本中包含特定字符 的单元格中仅提取单词 A2 多莉给我做了一个自制的蛋糕和一些松饼 A3 晚餐我们吃了奶酪 蛋糕 A4 每个人都喜欢面包店制作的美味 蛋糕 A5 约翰尼昨晚自己做了晚餐 然后打扫了厨
  • xlink 的 jQuery 选择器

    a xlink href coastline attr class grey a xlink href onshore attr class blue light 这就是我目前必须选择具有 xlink 的每个项目 coastline然后把它
  • 有没有办法很好地去除标签?

    有没有办法隐藏这个标签栏 附 不确定这个问题是否属于 stackoverflow 好的 我自己通过编写 VS 扩展来完成此操作 还将标题栏和菜单栏切换为自动隐藏 现在我的 VS 终于有了一个简约的视图 GitHub VS画廊
  • 如何在字典中打印换行符?

    我正在尝试通过字典创建一个查询 如下所示 Name name ID id Date of Birth dob 第二name是用户通过 raw input 输入的预设值 同样对于id和dob 这是我当前的代码 students id nNam
  • 是否可以预先评估 bash 的 PS1 中的值?

    我正在尝试构建一个 Bash 提示符 其中包含我的 git 分支信息 使用 git 的 bash completion 中的 git ps1 和一个小彩色笑脸来指示最近运行的命令是否成功 笑脸是使用这种技术创建的 我在这里找到了这样的技术
  • 如何使用 jquery mobile 创建 100% 高度的 div?

    如何创建 id test 高度为 100 的 div div div h1 Title h1 div div div div div div
  • OptaPlanner,Score计算速度会太低

    运行我的 optaplanner 项目并得到以下输出 看来有两个问题 这些输出是什么意思 第一个是 Score calculation speed will be too low because move thread s destroy
  • 如何在PHP中使mysql查询不断刷新?

    我正在制作一个基本的聊天室 我的代码 conn 127 0 0 1 root mymessages stmt SELECT FROM posts ORDER BY timestamp LIMIT 100 result mysqli quer
  • 将 jQuery 加载到 Django 中

    我有一个非常基本的问题 我正在尝试将一些 AJAX 功能构建到 Django 项目中 我打算使用 jQuery 现在 我只是通过 Linux 在本地运行代码 我一直在测试一些代码here所以我相当确定它是有效的 但我无法确定将 jQuery
  • com.android.support:appcompat-v7 和设计版本 23.2.0 崩溃包裹错误

    我在我的应用程序中使用了几个来自 android 支持的库 并在它们可用时更新它们 在版本 23 2 0 的测试期间 当我更改 Android 6 上的应用程序权限时 我遇到了崩溃 如您所知 当用户禁用权限时 会重新创建应用程序 与设备旋转
  • Android:图像绕中心旋转

    我正在尝试围绕中心旋转图像 这通常使用 RotateAnimation 工作 但我想让它更快一点 我现在使用带有单独绘图线程的 SurfaceView 模式 这是正确绘制位图的代码 取决于外部 标题 航向 角度 以度为单位 位图 位图 w
  • cmake 检测哪个库 libc++ 或 libstdc++ 配置为针对 g++ 或 clang++ 使用

    我写了一个CMakeLists txt构建一个项目g or clang 为了捕获尽可能多的错误 我同时使用了两者libc with D LIBCPP DEBUG2 2 for clang and libstdc with D GLIBCXX
  • 将 pandas multiindex 系列转换为 Json python

    嗨 我有两个类似于下面的熊猫系列 PnL Product Name Price Company A Orange 3000 Company B Apple 2000 Grapes 1000 Tax Product Name Price Co
  • 在 React Native 中更改 TouchableOpacity 的颜色

    谁能帮我 这是我的源代码 https snack expo io rJFgyPDpH 想法是 如果我点击 1 Button 它应该是 红色 如果我点击 2个按钮 也应该将其颜色更改为 红色 但是 1 个按钮 应将其更改为默认颜色黑色 然而
  • 快速获取 2 个日期之间的月份总数

    如何获得两个日期之间的总月份 这是约会的正常方式 1 开始日期 2020 2 22 10 25 00 2 结束日期 2020 3 3 12 34 00 let diffInDate Int Calendar current dateComp
  • 如何解析Controller中的Service Provider?

    我试图更好地理解服务容器在 Laravel 中的工作原理 所以我知道服务是用来拥有 Laravel 设置的你想要使用的东西 对吗 我正在尝试使用 LDAP php 内置函数制作一个简单的示例 我的里面有这个AppServiceProvide
  • 调用 Scanner.close() 会抛出 nosuchelementException

    我有一个简单的方法 可以将命令打印到屏幕上 扫描用户的输入 并将其作为字符串返回 如果用户的输入无效 它会通知用户并再次询问 此方法运行良好 但我的导师提到我们应该始终关闭资源 因此我返回并添加了 close 方法 现在每次调用该方法时 无
  • PostgreSQLgenerate_series()以SQL函数作为参数

    我有一个名为的 SQL 函数get forecast history integer integer 这需要两个参数 一个月和一年 该函数返回使用以下命令创建的自定义类型 CREATE TYPE fcholder AS y integer