当前位置: 首页 > 面试题库 >

Postgres-如何返回缺少计数的0行?

徐皓君
2023-03-14
问题内容

我几年(2003-2008年)的数据分布不均(写日期)。我想查询给定开始日期和结束日期的数据,按PostgreSQL
8.3(http://www.postgresql.org/docs中支持的任何间隔(天,周,月,季度,年)将数据分组/8.3/static/functions-datetime.html#FUNCTIONS-
DATETIME-TRUNC
)。

问题在于,某些查询会在要求的时间内连续提供结果,如下所示:

select to_char(date_trunc('month',date), 'YYYY-MM-DD'),count(distinct post_id) 
from some_table where category_id=1 and entity_id = 77  and entity2_id = 115 
and date <= '2008-12-06' and date >= '2007-12-01' group by 
date_trunc('month',date) order by date_trunc('month',date);
          to_char   | count 
        ------------+-------
         2007-12-01 |    64
         2008-01-01 |    31
         2008-02-01 |    14
         2008-03-01 |    21
         2008-04-01 |    28
         2008-05-01 |    44
         2008-06-01 |   100
         2008-07-01 |    72
         2008-08-01 |    91
         2008-09-01 |    92
         2008-10-01 |    79
         2008-11-01 |    65
        (12 rows)

但是其中一些会因为没有数据而错过一些时间间隔,例如:

select to_char(date_trunc('month',date), 'YYYY-MM-DD'),count(distinct post_id) 
from some_table where category_id=1 and entity_id = 75  and entity2_id = 115 
and date <= '2008-12-06' and date >= '2007-12-01' group by 
date_trunc('month',date) order by date_trunc('month',date);

        to_char   | count 
    ------------+-------

     2007-12-01 |     2
     2008-01-01 |     2
     2008-03-01 |     1
     2008-04-01 |     2
     2008-06-01 |     1
     2008-08-01 |     3
     2008-10-01 |     2
    (7 rows)

所需结果集为:

  to_char   | count 
------------+-------
 2007-12-01 |     2
 2008-01-01 |     2
 2008-02-01 |     0
 2008-03-01 |     1
 2008-04-01 |     2
 2008-05-01 |     0
 2008-06-01 |     1
 2008-07-01 |     0
 2008-08-01 |     3
 2008-09-01 |     0
 2008-10-01 |     2
 2008-11-01 |     0
(12 rows)

缺少条目的计数为0。

我已经看到了关于堆栈溢出的较早讨论,但是它们似乎并不能解决我的问题,因为我的分组时间是(天,周,月,季度,年)之一,并且由应用程序决定运行时。因此,我猜想像日历表或序列表的左联接之类的方法将无济于事。

我目前的解决方案是使用日历模块填补Python(在Turbogears App中)的这些空白。

有一个更好的方法吗。


问题答案:

您可以使用以下方法创建去年(例如)的所有前几天的列表

select distinct date_trunc('month', (current_date - offs)) as date 
from generate_series(0,365,28) as offs;
          date
------------------------
 2007-12-01 00:00:00+01
 2008-01-01 00:00:00+01
 2008-02-01 00:00:00+01
 2008-03-01 00:00:00+01
 2008-04-01 00:00:00+02
 2008-05-01 00:00:00+02
 2008-06-01 00:00:00+02
 2008-07-01 00:00:00+02
 2008-08-01 00:00:00+02
 2008-09-01 00:00:00+02
 2008-10-01 00:00:00+02
 2008-11-01 00:00:00+01
 2008-12-01 00:00:00+01

然后,您可以加入该系列。



 类似资料:
  • 问题内容: 我敢肯定这个问题已经问过了,但是找不到嵌套的if-else和switch-case逻辑解决我的问题的答案。 我有两个部分,每个部分都有两个自定义单元格。就是这样。4格。但是无论我做什么,都会得到“在期望返回的函数中缺少返回” 问题 如何更改此设置,以便在底部获得满足快速逻辑的else语句? 任何帮助将不胜感激 问题答案: 在方法开始时声明单元格, 根据部分和行号为单元格分配一个值, 在

  • 问题内容: 我正在使用goLang lib / pq驱动程序,并尝试从数据库中获取行。 我想要一个if else子句,该子句检查结果集中是否有行,我这样做了: 但这总是少给我1条记录,由于该子句,我认为它会跳过一条记录,因为一旦我删除了子句,我就会正确地获得所有记录。我如何知道从选择查询返回的行数而不执行另一个查询? 问题答案: 使用“ 行”对象时,没有任何帮助程序方法可以一步完成总行数的计算。

  • 有时它可以返回多个结果。因此,我不认为会起作用。 如何在Python中计算行数?就像在PHP中一样,我可以使用。 我找不到任何方法来做这件事。我正在使用Python3。 我对python MySQL绝对是新手。我对PHP中的MySQL真的很熟悉。 您可以使用来实现。但是,出于我的好奇:有没有方法直接使用pymysql来实现它?

  • 我有一种感觉,这是一个业余的错误,我希望你们能帮助我!

  • 问题 为什么PayPal在返回参数之前?(问号)? 如何解决此问题,如何获取其他参数? 什么是最干净的解决方案?

  • 我有一个二维布尔数组“poorSignal”,需要编写一个返回网格的方法,如果数组上的一个点为真,则显示X,如果为假,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“missing return statement”。我也不确定“return”\n在打印阵列时是否可以添加新行。 这是一个赋值问题,所以我不能直接打印它,也不能只打印布尔值——它必须是一个生成网格的方法。