Function Postgres视图/功能

Function Postgres视图/功能,function,postgresql,view,Function,Postgresql,View,我试图创建一个视图,该视图连接两个表,但结果取决于查询。下面是我想要实现的一个例子 我有一个名为sessionaccounting的表和一个名为sessionaccountingdailysplit的表 sessionaccounting包含我们所有的会计数据,并且sessionaccountingdailysplit是按日期分割的sessionaccounting数据。它们由外键sessionaccountingid连接 这两个表是如何协调工作的,如下所示: 对于sessionaccounti

我试图创建一个视图,该视图连接两个表,但结果取决于查询。下面是我想要实现的一个例子

我有一个名为sessionaccounting的表和一个名为sessionaccountingdailysplit的表

sessionaccounting包含我们所有的会计数据,并且sessionaccountingdailysplit是按日期分割的sessionaccounting数据。它们由外键sessionaccountingid连接

这两个表是如何协调工作的,如下所示:

对于sessionaccounting中的行:

开始时间-“2012-01-01”,结束时间-“2012-01-03”,使用量-10000

对于sessionaccountingdailysplit中的行:

日期-'2012-01-01',用途-3000

日期-“2012-01-02”,使用量-5000

日期-“2012-01-03”,使用期限-2000年

现在我想做的是运行一个名为vw_sessionaccountingas的视图

SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';
选择*
来自vw_会议会计
其中starttime>='2011-01-01'和starttime='2011-01-01'以及starttime='2011-01-01'

开始时间你的问题在几个方面有点模糊。但从我收集和猜测的情况来看,您的查询(视图)可能如下所示:

SELECT s.starttime
      ,s.endtime
      ,COALESCE(max(sd.date), s.endtime) AS effective_endtime_max_2_days
      ,COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days
FROM   sessionaccounting s
LEFT   JOIN sessionaccountingdailysplit sd USING (sessionaccountingid)
WHERE  sd.sessionaccountingid IS NULL  -- no split ..
   OR  (starttime + 2) > sd.date -- .. or only the first two days of the split
按s.starttime和s.endtime分组

要点
  • 使用
    左连接
    ,因为:
。。。大多数情况下,sessionaccountingdailysplit不会有一行,因为没有拆分

  • 仅包括前两天:
    (开始时间+2)>sd.date

  • 确保包括没有spit:
    的会话,其中sd.sessionaccountingid为NULL或

  • 使用表别名来消除您庞大的表名:
    来自sessionaccounting s

  • sum()
    前两天的使用情况。如果没有spit,则将原始总使用量改为:
    COALESCE(sum(sd.usage),s.usage)作为使用量\u max\u 2天


我不清楚你在问什么。你为什么需要这个视角?如果最后一个查询提供了您需要的内容,为什么不使用它呢?
SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' 
AND starttime <= '2011-01-02';
SELECT s.starttime
      ,s.endtime
      ,COALESCE(max(sd.date), s.endtime) AS effective_endtime_max_2_days
      ,COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days
FROM   sessionaccounting s
LEFT   JOIN sessionaccountingdailysplit sd USING (sessionaccountingid)
WHERE  sd.sessionaccountingid IS NULL  -- no split ..
   OR  (starttime + 2) > sd.date -- .. or only the first two days of the split