Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL结果中添加缺少的日期_Sql_Postgresql - Fatal编程技术网

从SQL结果中添加缺少的日期

从SQL结果中添加缺少的日期,sql,postgresql,Sql,Postgresql,我有一个数据库,目前看起来像这样 Date | valid_entry | profile 1/6/2015 1 | 1 3/6/2015 2 | 1 3/6/2015 2 | 2 5/6/2015 4 | 4 我正在尝试获取日期,但我需要查询以显示列表中不存在的日期,例如2015年2月6日 这是我所需要的样本: Date | valid_entry 1/6/2015 1 2/6

我有一个数据库,目前看起来像这样

Date     | valid_entry | profile
1/6/2015   1           | 1
3/6/2015   2           | 1
3/6/2015   2           | 2
5/6/2015   4           | 4
我正在尝试获取日期,但我需要查询以显示列表中不存在的日期,例如2015年2月6日

这是我所需要的样本:

Date     | valid_entry
1/6/2015   1
2/6/2015   0
3/6/2015   2
3/6/2015   2
4/6/2015   0
5/6/2015   4 
我的问题是:

select date, count(valid_entry)
from database
where profile = 1
group by 1;

此查询将仅显示其中存在的日期。在查询中是否有一种方法可以用其中不存在的日期填充结果?

为此,您必须使用日历表。在这种情况下,您可以使用所需的表创建一个内嵌表,然后
将您的表左键联接到它:

select "date", count(valid_entry)
from (
   SELECT '2015-06-01' AS d UNION ALL '2015-06-02' UNION ALL '2015-06-03' UNION ALL
          '2015-06-04' UNION ALL '2015-06-05' UNION ALL '2015-06-06') AS t
left join database AS db on t.d = db."date" and db.profile = 1
group by t.d;

注意:谓词
profile=1
应应用于
左JOIN
操作的
ON
子句中。如果将其放在
WHERE
子句中,则
左连接实际上变成了
内部连接

,为此,您必须使用日历表。在这种情况下,您可以使用所需的表创建一个内嵌表,然后
将您的表左键联接到它:

select "date", count(valid_entry)
from (
   SELECT '2015-06-01' AS d UNION ALL '2015-06-02' UNION ALL '2015-06-03' UNION ALL
          '2015-06-04' UNION ALL '2015-06-05' UNION ALL '2015-06-06') AS t
left join database AS db on t.d = db."date" and db.profile = 1
group by t.d;

注意:谓词
profile=1
应应用于
左JOIN
操作的
ON
子句中。如果将其放在
WHERE
子句中,则
左连接实际上变成了
内部连接

您可以使用
generate_series()
从源表生成开始日期和结束日期之间的所有日期的列表。然后,可以在外部联接中使用这些日期对所有日期的值求和

with all_dates (date) as (
  select dt::date
  from generate_series( (select min(date) from some_table), (select max(date) from some_table), interval '1' day) as x(dt)
)
select ad.date, sum(coalesce(st.valid_entry,0))
from all_dates ad
  left join some_table st on ad.date = st.date
group by ad.date, st.profile
order by ad.date;  
some_table
是包含您提供的示例数据的表

根据您的示例输出,您似乎还希望按日期分组,否则2015-06-03不能有两行。您似乎也不希望在profile=1的情况下使用
,因为这也不会像示例输出中所示,在2015-06-03中生成两行

SQLFiddle示例:



无关,但是:我希望列名只是虚构的<代码>日期
是一个列的名称。首先,因为它也是一个关键字,但更重要的是,它没有记录这个日期的用途。开始日期?结束日期?到期日?修改日期?

您可以使用
generate_series()
从源表中生成一个介于开始日期和结束日期之间的所有日期的列表。然后,可以在外部联接中使用这些日期对所有日期的值求和

with all_dates (date) as (
  select dt::date
  from generate_series( (select min(date) from some_table), (select max(date) from some_table), interval '1' day) as x(dt)
)
select ad.date, sum(coalesce(st.valid_entry,0))
from all_dates ad
  left join some_table st on ad.date = st.date
group by ad.date, st.profile
order by ad.date;  
some_table
是包含您提供的示例数据的表

根据您的示例输出,您似乎还希望按日期分组,否则2015-06-03不能有两行。您似乎也不希望在profile=1的情况下使用
,因为这也不会像示例输出中所示,在2015-06-03中生成两行

SQLFiddle示例:



无关,但是:我希望列名只是虚构的<代码>日期
是一个列的名称。首先,因为它也是一个关键字,但更重要的是,它没有记录这个日期的用途。开始日期?结束日期?到期日?修改日期?

请参考以下链接您是否可以使用一个包含所有日期的虚拟表,然后使用union获取-不在实际表中-日期?我不明白您如何计算预期输出中的
有效\u项的值。第二行的
4
com来自哪里?那不应该是
0
,因为2015-06-02没有行吗?@a_horse_没有名字对不起,应该是0。我按如下方式更新了代码。请参考以下链接。您是否可以使用一个包含所有日期的虚拟表,然后使用union来获取-不在实际表中-日期?我不明白您如何计算预期输出中的
有效\u项的值。第二行的
4
com来自哪里?那不应该是
0
,因为2015-06-02没有行吗?@a_horse_没有名字对不起,应该是0。我更新了下面的代码。@a_horse_和_no_名字我以为这是一个mysql问题!可悲的是,这不是我想要的,因为这对于我所需要的东西来说有点太静态了。@a_horse_,没有名字,我以为这是一个mysql问题!可悲的是,这不是我要找的,因为这是一个有点太静态我需要它。非常感谢。这是非常接近我需要的。是的,这些柱子是组合起来的。实际的数据库比这个大得多,但这是我关注的3列。非常感谢。这是非常接近我需要的。是的,这些柱子是组合起来的。实际的数据库比这个大得多,但这是我关注的3列。