选择批次行

时间:2012-12-03 15:33:45

标签: sql postgresql

我有一个表widget_events,用于记录发生的event_what个事件 小组widget_id的日期event_when。同一事件可能会发生 在同一天多次出现在同一个小部件中。为此原因, 列event_id用作主键来区分这些行。这是 表声明:

CREATE TABLE widget_events
(
event_id    int4 UNIQUE NOT NULL,
event_when  date NOT NULL,
event_what  text NOT NULL,
widget_id   int4 REFERENCES widgets (widget_id) NOT NULL,
PRIMARY KEY (event_id)
);

客户端应用程序批量处理事件,每个批处理包含在这些事件中 一个日期中一个小部件的所有事件。但是,申请没有 以前了解哪些小部件和日期存储在widget_events

一种可能的解决方案是从中选择一个随机行 widget_events(使用SQL的LIMIT),然后对所有人进行另一次查询 具有相同widget_idwidget_when的行。这批次之后 处理后,可以从widget_events删除这些行,然后我们回去 到第一步。当第一步报告时,算法停止 没有更多的随机行返回。

我的问题是,是否有更快,更优雅的方式来做到这一点。 是否可以在SQL中(特别是PostgreSQL理解的SQL) 在单个查询中返回每个不同的批次?

2 个答案:

答案 0 :(得分:3)

选择不同的批次:

select  distinct event_when
,       event_what
from    widget_events

或者您可以在一个查询中选择一个批处理,例如:

select  batch.*
from    widget_events batch
join    (
        select  event_when
        ,       event_what
        from    widget_events
        limit   1
        ) filter
on      filter.event_when = batch.event_when
        and filter.event_what = batch.event_what

答案 1 :(得分:1)

为什么不直接返回按event_when排序的行:

select *
from widget_events we
order by event_when, event_what, event_id

我也投入了event_what,因此所有类似的事件都将在连续的行上。

然后,您的逻辑可以只查找日期更改以确定某些内容是否是最后一个事件。如果你愿意,你甚至可以将它放入选择中:

select *,
       (case when lag(event_when) over (partition by event_id) < event_when then 1
             else 0
        end) as isFirst,
       (case when lead(event_when) over (partition by event_id) < event_when then 1
             else 0
        end) as isLast
from widget_events we
order by event_when, event_what, event_id