【发布时间】:2014-02-10 14:24:08
【问题描述】:
我有一张桌子,上面有以下内容:
- eventid -> 主键,数字越大表示越新
- itemid -> 项目表的外键
- 消息 -> 事件消息
每个 itemid 将有 100/1000 个事件。我需要的是从表中为 itemid 的每个唯一值获取 X 个最新事件。在这种情况下,X 是 20,“最新”是最高的 eventid。
我之前所做的是获取整个表,并且只为每个 itemid 保留 20 个最新的。这是非常缓慢且低效的。
编辑:我正在使用 opennms 和事件表 (OpenNMS create.sql): (itemid == nodeID)
create table events (
eventID integer not null,
eventUei varchar(256) not null,
nodeID integer,
eventTime timestamp with time zone not null,
eventHost varchar(256),
eventSource varchar(128) not null,
ipAddr varchar(16),
eventDpName varchar(12) not null,
eventSnmphost varchar(256),
serviceID integer,
eventSnmp varchar(256),
eventParms text,
eventCreateTime timestamp with time zone not null,
eventDescr varchar(4000),
eventLoggroup varchar(32),
eventLogmsg varchar(256),
eventSeverity integer not null,
eventPathOutage varchar(1024),
eventCorrelation varchar(1024),
eventSuppressedCount integer,
eventOperInstruct varchar(1024),
eventAutoAction varchar(256),
eventOperAction varchar(256),
eventOperActionMenuText varchar(64),
eventNotification varchar(128),
eventTticket varchar(128),
eventTticketState integer,
eventForward varchar(256),
eventMouseOverText varchar(64),
eventLog char(1) not null,
eventDisplay char(1) not null,
eventAckUser varchar(256),
eventAckTime timestamp with time zone,
alarmID integer,
constraint pk_eventID primary key (eventID)
);
我的查询很简单:
SELECT eventid, nodeid, eventseverity, eventtime, eventlogmsg
FROM events
WHERE nodeid IS NOT NULL;
【问题讨论】:
-
您能否将您的表结构发布为
CREATE TABLE ...、数据示例和您现有的查询? -
@IgorRomanchenko 用这些细节编辑了帖子
标签: sql postgresql greatest-n-per-group window-functions