Sql 为满足期间之间where条件的每行添加一个
我有一个Postgres表,我正试图根据一些日期列来分析它 我基本上是在计算表中满足此要求的行数,然后按月份和年份对它们进行分组。我的查询不是这样的: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
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中没有日期部分,这个答案是错误的。