Postgres视图/功能

时间:2012-03-08 13:02:36

标签: function postgresql view

我正在尝试创建一个连接2个表的视图,但结果取决于查询。这是我想要实现的一个例子。

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

sessionaccounting 包含我们所有的会计数据, sessionaccountingdailysplit 是按日期拆分的会话记录数据。它们由外键 sessionaccountingid

连接在一起

两个表如何协同工作如下:

表示sessionaccounting中的行:

  

starttime - '2012-01-01',endtime - '2012-01-03',usage - 10000

表示sessionaccountingdailysplit中的行:

  

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

     

日期 - '2012-01-02',用法 - 5000

     

日期 - '2012-01-03',用法 - 2000

现在我要做的是如果我将名为 vw_sessionaccounting 的视图作为

运行
SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';

它必须仅对 sessionaccountingdailysplit 中的前两个日期求和,并相应地替换每个受影响行的 sessionaccounting 中的用法。 (大多数情况下 sessionaccountingdailysplit 因为没有拆分而没有一行)

如上所述,如果我运行

SELECT * 
FROM sessionaccounting 
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';

我会得到

的结果
  

starttime - '2012-01-01',endtime - '2012-01-03',usage - 10000

但如果我运行查询

SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' 
AND starttime <= '2011-01-02';

我会得到

的结果
  

starttime - '2012-01-01',endtime - '2012-01-03',usage - 8000

1 个答案:

答案 0 :(得分:2)

你的问题在某些方面有点模糊。但是从我收集和猜测的结果来看,您的查询(视图)可能如下所示:

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

GROUP BY s.starttime,s.endtime

重点

  • 使用LEFT JOIN因为:
  

...大多数情况下sessionaccountingdailysplit没有一行,因为没有分裂

  • 仅包含前两天:(starttime + 2) > sd.date

  • 请确保包含没有吐出的会话:WHERE sd.sessionaccountingid IS NULL OR

  • 使用表别名来解决您的怪异表名:
    FROM sessionaccounting s

  • sum()前两天的使用情况。如果没有吐,请改为使用原始总使用量:COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days