通过分组选择限制

时间:2013-02-07 09:25:36

标签: sql postgresql

假设我有一个名为events的表:

CREATE TABLE events (
  id      integer,
  dtstart timestamptz);

INSERT INTO events VALUES 
(4,'2010-06-29 04:00:00'),
(5,'2010-06-29 13:00:00'),
(6,'2011-07-01 20:00:00'),
(7,'2012-07-03 14:30:00');

有两个输入参数dtfromdays我需要从events表事件中选择dtstart >= dtfrom,其中groupby(date(dtstart)) <= days

例如,使用上表和dtfrom='2010-06-29'以及days=2我应该会收到以下事件:

(4,'2010-06-29 04:00:00'),
(5,'2010-06-29 13:00:00'),
(6,'2011-07-01 20:00:00'),

我现在就谈到这个:

SELECT DATE(dtstart) AS _dtstart
FROM events
WHERE dtstart > '2010-06-29 00:00:00'
GROUP BY _dtstart
ORDER BY _dtstart
LIMIT 2;

但我想避免分组。

我需要获取下一个days天内存在的事件。天不应该包括没有事件的日子。

换句话说:获取在“2010-06-29 00:00:00”之后开始的事件,但是他们开始的不同日期的数量不应超过2(或10,或......)。

1 个答案:

答案 0 :(得分:1)

我认为,dtfrom属于timestamptz类型,days是整数。

如果我理解你的问题,这就是你所需要的(也在SQL Fiddle上):

WITH r AS (
  SELECT '2010-06-29 00:00:00'::timestamptz dtfrom,
         2 days)
SELECT *
  FROM events e, r
 WHERE e.dtstart >= r.dtfrom
   AND date(e.dtstart) < date(r.dtfrom + ((r.days+1)||' days')::interval);
  1. 我使用WITH查询来指定输入参数;
  2. 使用timestamptz比较来开始范围,'cos可能指定Jun / 29的08:00而记录#4没有进入范围;
  3. 使用date比较作为范围的结尾,将额外的一天添加到指定的数字,因为date()转换将截止时间。

  4. this query会产生所需的输出吗?

    SELECT *
      FROM events e
     WHERE e.dtstart >= '2010-06-29 00:00:00'
     ORDER BY e.dtstart
     LIMIT 3;