【问题标题】:Select with limit by grouping通过分组限制选择
【发布时间】:2013-02-07 09:25:36
【问题描述】:

假设,我有一个名为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,或...)。

【问题讨论】:

  • 预期结果是什么? 4 2010-06-29 04:00:00, 5 2010-06-29 13:00:00, 6 2010-07-01 20:00:00 ?
  • 是的,还有我可能想要的所有其他字段
  • 请注意,可能有 2 个事件的间隔为一年,并且在该间隔内没有其他事件,并且拥有days=2 我应该得到所有这些
  • 我不太明白groupby(date(dtstart)) <= days 是什么意思。您是否需要它们之间的间隔小于 2 天的所有行?或者您需要相同日期存在两次的所有行?
  • 我需要获取存在于days 天的事件。 days 不应包括没有事件的日子

标签: sql postgresql


【解决方案1】:

我假设dtfromtimestamptz 类型,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 比较来开始范围,因为可能会指定6 月29 日的08:00 并且记录#4 没有进入范围;
  3. 使用date 比较作为范围的末尾,在指定的数字上增加1 天,因为date() 转换将截止时间。

this query 是否产生所需的输出?

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

【讨论】:

  • 08:00 可能有错字,试试这个:sqlfiddle.com/#!12/baa11/5
  • @warwaruk,并不是一个错字。尝试将输入参数的值更改为2010-06-29 00:00:00。我想表明不同的dtfrom 值可能会导致不同的集合。
  • @warwaruk,我看到的数据没有改变。我已经更新了查询。
  • @warwaruk,正确,对不起。所以,查询返回你想要的:接下来 2 天匹配的行,对吧?否则,您需要查看更改后的测试数据所需的输出。
  • 这些事件 (4,'2010-06-29 04:00:00'), (5,'2010-06-29 13:00:00'), (6,'2011- 07-01 20:00:00') 预计 - 接下来两天有活动:2010-06-29 和 2011-07-01
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2015-07-26
  • 2013-04-29
  • 2022-01-05
相关资源
最近更新 更多