我有一个表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_id
和widget_when
的行。这批次之后
处理后,可以从widget_events
删除这些行,然后我们回去
到第一步。当第一步报告时,算法停止
没有更多的随机行返回。
我的问题是,是否有更快,更优雅的方式来做到这一点。 是否可以在SQL中(特别是PostgreSQL理解的SQL) 在单个查询中返回每个不同的批次?
答案 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