Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 为满足期间之间where条件的每行添加一个_Sql_Database_Postgresql - Fatal编程技术网

Sql 为满足期间之间where条件的每行添加一个

Sql 为满足期间之间where条件的每行添加一个,sql,database,postgresql,Sql,Database,Postgresql,我有一个Postgres表,我正试图根据一些日期列来分析它 我基本上是在计算表中满足此要求的行数,然后按月份和年份对它们进行分组。我的查询不是这样的: SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' and date2::date > '2012-05-31'; date1::date <= '2012-06-31' and date2::date > '201

我有一个Postgres表,我正试图根据一些日期列来分析它

我基本上是在计算表中满足此要求的行数,然后按月份和年份对它们进行分组。我的查询不是这样的:

SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' 
                       and date2::date > '2012-05-31';
date1::date <= '2012-06-31' and date2::date > '2012-06-31'
SELECT DATEPART(year, date1) Year, DATEPART(month, date1) Month, SUM(value_col)
FROM $Table
-- WHERE CLAUSE ?
GROUP BY DATEPART(year, date1),
  DATEPART(month, date1)
它应该能够在我的数据中显示可用月份的数据,这样我就不必每次添加新数据时都手动更改月份,这样我就可以通过一次查询获得所有信息

在上面的例子中,我希望它将符合标准的行的总和分组到2012年和05月。类似地,如果我的WHERE子句如下所示:

SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' 
                       and date2::date > '2012-05-31';
date1::date <= '2012-06-31' and date2::date > '2012-06-31'
SELECT DATEPART(year, date1) Year, DATEPART(month, date1) Month, SUM(value_col)
FROM $Table
-- WHERE CLAUSE ?
GROUP BY DATEPART(year, date1),
  DATEPART(month, date1)

我希望它将这笔金额分为2012年和06月。

听起来你可以从T-SQL方法中受益。如果我理解正确,你可以这样做:

SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' 
                       and date2::date > '2012-05-31';
date1::date <= '2012-06-31' and date2::date > '2012-06-31'
SELECT DATEPART(year, date1) Year, DATEPART(month, date1) Month, SUM(value_col)
FROM $Table
-- WHERE CLAUSE ?
GROUP BY DATEPART(year, date1),
  DATEPART(month, date1)

理由如下。首先,创建一个所有可能日期的列表。然后获取截至给定日期的date1的累积数。然后得到日期后date2的累积数,并减去结果。下面的查询使用相关子查询来实现这一点,相关子查询不是我最喜欢的构造,但在这种情况下非常方便:

select thedate,
       (select count(*) from t where date1::date <= d.thedate) -
       (select count(*) from t where date2::date > d.thedate)
from (select distinct thedate
      from ((select date1::date as thedate from t) union all
            (select date2::date as thedate from t)
           ) d
     ) d

这是假设date2发生在date1之后。我的模型是客户的起止日期。如果不是这样,查询可能不起作用。

我不完全清楚这一点:

我希望它将行的总和分组

我将这样解释:您希望列出每月符合条件的所有行:

WITH x AS (
    SELECT date_trunc('month', min(date1)) AS start
          ,date_trunc('month', max(date2)) + interval '1 month' AS stop
    FROM   tbl
   )
SELECT to_char(y.mon, 'YYYY-MM') AS mon, t.*
FROM  (
   SELECT generate_series(x.start, x.stop, '1 month') AS mon
   FROM   x
   ) y
LEFT   JOIN tbl t ON t.date1::date <= y.mon 
                 AND t.date2::date >  y.mon   -- why the explicit cast to date?
ORDER  BY y.mon, t.date1, t.date2;
假设date2>=date1

计算时间段的上下边界,并截断为月份,向上边界添加1以包括最后一行

用于创建有问题的月份集

使用声明的条件左键联接表中的行,并按月排序

在这一阶段,你也可以分组计算聚合量。

甚至是日期,日期部分为“年”,日期1,日期部分为“月”,日期1……PostgreSQL中没有日期部分,这个答案是错误的。