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