当前位置: 首页 > 知识库问答 >
问题:

Postgresql:从2个表创建视图,在同一列的最大值上加入

公孙高轩
2023-03-14

我有两张桌子

系统日志

request_id   request_date
----------------------------
1            2022-01-01
2            2022-01-02

价值观

request_id   city      country
---------------------------------
1            Berlin    DE
1            Dortmund  DE
1            Dresden   DE
1            Paris     FR
1            London    EN
2            Dublin    IR
2            Bochum    DE
2            Essen     DE
2            Herne     DE

我正在尝试创建一个视图,其中仅显示来自上一个请求(max request\u id)的数据。

理想结果

request_id   city      country    request_date
----------------------------------------------
2            Dublin    IR         2022-01-02
2            Bochum    DE         2022-01-02
2            Essen     DE         2022-01-02
2            Herne     DE         2022-01-02

到目前为止,我做了一个在两个表中都匹配请求id的例子

SELECT * FROM (SELECT DISTINCT city, 
    country, 
    sys_log.request_id,
    sys_log.request_date
FROM public."Values" AS VAL
LEFT JOIN (
    SELECT sys.request_date, 
    sys.request_id
    FROM public."Sys_Log" AS sys
) AS sys_log ON sys_log.request_id = VAL.request_id
WHERE VAL.request_id IS NOT NULL) AS VAL_View

我不知道如何继续,最大(request_id)我得到一个错误。

SELECT * FROM (SELECT DISTINCT city, 
    country, 
    sys_log.request_id,
    sys_log.request_date
FROM public."Values" AS VAL
LEFT JOIN (
    SELECT sys.request_date, 
    max(sys.request_id) as max_ri
    FROM public."Sys_Log" AS sys
) AS sys_log ON sys_log.max_ri= VAL.request_id
WHERE VAL.request_id IS NOT NULL) AS VAL_View

错误:

Spalte"sys.request_date"muss in der GROUP-BY-Klausel erschinen oder in einer Aggregatfunktion verwender t werden

像sys.request_date必须在GROUP-BY或agg中使用。函数。

共有2个答案

杜河
2023-03-14

您可以使用秩函数,尝试:

with cte as (
      SELECT request_id,city,country
             ,RANK () OVER (ORDER BY request_id desc ) id_rank
     FROM
     values_tbl
) select cte.request_id,city,country,request_date 
  from cte 
  inner join sys_Log on cte.request_id=sys_Log.request_id
  where cte.id_rank=1;

结果:

request_id    city    country request_date
     2        Herne      DE   2022-01-02
     2        Essen      DE   2022-01-02
     2        Bochum     DE   2022-01-02
     2        Dublin     IR   2022-01-02

演示

查看查询:

create view my_view as with cte as (
      SELECT request_id,city,country
             ,RANK () OVER (ORDER BY request_id desc ) id_rank
     FROM
     values_tbl
) select cte.request_id,city,country,request_date 
  from cte 
  inner join sys_Log on cte.request_id=sys_Log.request_id
  where cte.id_rank=1;

演示

梅飞宇
2023-03-14

如本文所述,您可以使用限制。因此,您的查询如下所示:

SELECT * FROM (SELECT DISTINCT city, 
    country, 
    sys_log.request_id,
    sys_log.request_date
FROM public."Values" AS VAL
LEFT JOIN (
    SELECT sys.request_date, 
    sys.request_id
    FROM public."Sys_Log" ORDER BY sys.request_id DESC LIMIT 1 AS sys
) AS sys_log ON sys_log.request_id = VAL.request_id
WHERE VAL.request_id IS NOT NULL) AS VAL_View


 类似资料:
  • 问题内容: 我有一个带有2个索引的PostgreSQL表。索引之一是涵盖和列,并且是唯一的B树索引。第二索引仅覆盖该列,并且是非唯一索引。 如果第一个索引存在,那么第二个索引是否冗余?换句话说,拥有第二个索引会没有好处吗? 问题答案: postgres多列索引只能用于搜索第一列,因此在实践中是多余的。 可以将多列B树索引用于涉及该索引列的任何子集的查询条件,但是当前导(最左边)列受到约束时,该索引

  • 问题内容: 搜索后,我没有在网上或任何其他资源中找到任何东西,我想知道您是否可以通过联接另一个视图和一些其他表来形成一个视图?我猜类似的东西与Server_ref.part_notification_view是要加入的视图。 问题答案: 您当然可以在另一个视图的基础上建立一个视图: 但是您不能引用基础表中的任何内容,包括不属于视图的任何字段: 具有相同列的基础表不是问题,并且如果您在视图中包含的内

  • 问题内容: 我有看起来像的数据框: 为了进一步处理数据,我需要拆分该列,然后将其替换为如下所示的多列: 因此,这些列可以追加到初始数据帧。我不知道该怎么做,因为像 不能解决我的问题,因为我不仅需要基于列表中位置的列,还需要基于列表中每个唯一值的列。您知道我该如何处理吗? 问题答案: 您可以使用和: 如果需要计数值,则可以使用(我添加一个字符串进行测试):

  • 我是Hibernate的新手,正在尝试学习它。我对@JoinCol列的用法感到困惑。我知道它创建了一个列来关联两个实体。我尝试过的是: 有两个阶级的人和房子 个人阶级有一套与一个家庭有关系的房子 当面授课: 这将在表上创建一个名为的列。 内部课程: 这将在表上再次创建列。但我希望能在表上看到这个专栏。为什么会这样? 我在想@JoinColumn annotation会在表上创建一个连接列,这就是我

  • 问题内容: 我有一个我想在SQL企业管理器中创建表的视图,但是运行此查询时总是会出现错误: 到目前为止,错误是:“’as’处的语法错误” 视图太大。是否可以使用前10名? 问题答案: 不支持。 用这个: 或者

  • 问题内容: 我有三个表: 我正在尝试创建一个视图,例如: 到目前为止,这是我的代码。我认为这是不正确的: 一个问题是,存在的国家可能不在中。一年也是如此。存在的年份可能不存在。因此,我一直认为上述代码无法正常工作。 问题答案: 谢谢您的帮助。这就是我为了使它工作而最终要做的事情。