Postgresql 忽略查询结果中的第一行和最后一行

Postgresql 忽略查询结果中的第一行和最后一行,postgresql,Postgresql,我正在尝试执行一个查询,希望忽略结果查询的第一行和最后一行 我的结果查询是检索过去一小时内按5分钟分组的所有介质的总和 要忽略我使用offset1的第一条记录,要忽略最后一条记录,我试图在我的id字段中进行限制,按时间戳desc排序 我的问题是: ws_controller_hist=> SELECT to_timestamp(floor((extract('epoch' FROM TIMESTAMP) / 300)) * 300) AS timestamp_min,

我正在尝试执行一个查询,希望忽略结果查询的第一行和最后一行

我的结果查询是检索过去一小时内按5分钟分组的所有介质的总和

要忽略我使用offset1的第一条记录,要忽略最后一条记录,我试图在我的id字段中进行限制,按时间戳desc排序

我的问题是:

ws_controller_hist=>  
SELECT to_timestamp(floor((extract('epoch' FROM TIMESTAMP) / 300)) * 300) 
AS timestamp_min,
       TYPE,
       floor(sum(medium[1]))
FROM default_dataset
WHERE TYPE LIKE 'ap_clients.wlan0'
  AND TIMESTAMP > CURRENT_TIMESTAMP - interval '85 minutes'
  AND organization_id = '9fc02db4-c3df-4890-93ac-8dd575ca5638'
  AND id NOT IN
    (SELECT id
     FROM default_dataset
     ORDER BY TIMESTAMP DESC
     LIMIT 1)
GROUP BY timestamp_min,
         TYPE
ORDER BY timestamp_min ASC
OFFSET 1;

     timestamp_min      |       type       | floor
------------------------+------------------+-------
 2017-12-19 14:20:00+00 | ap_clients.wlan0 |    38
 2017-12-19 14:25:00+00 | ap_clients.wlan0 |    37
 2017-12-19 14:30:00+00 | ap_clients.wlan0 |    39
 2017-12-19 14:35:00+00 | ap_clients.wlan0 |    42
 2017-12-19 14:40:00+00 | ap_clients.wlan0 |    43
 2017-12-19 14:45:00+00 | ap_clients.wlan0 |    44
 2017-12-19 14:50:00+00 | ap_clients.wlan0 |    45
 2017-12-19 14:55:00+00 | ap_clients.wlan0 |    45
 2017-12-19 15:00:00+00 | ap_clients.wlan0 |    43
 2017-12-19 15:05:00+00 | ap_clients.wlan0 |    43
 2017-12-19 15:10:00+00 | ap_clients.wlan0 |    50
 2017-12-19 15:15:00+00 | ap_clients.wlan0 |    52
 2017-12-19 15:20:00+00 | ap_clients.wlan0 |    50
 2017-12-19 15:25:00+00 | ap_clients.wlan0 |    53
 2017-12-19 15:30:00+00 | ap_clients.wlan0 |    49
 2017-12-19 15:35:00+00 | ap_clients.wlan0 |    39
 2017-12-19 15:40:00+00 | ap_clients.wlan0 |    16

这并不是忽略最后一条记录,因为我有相同的记录不使用子查询和id不在按时间戳顺序从默认数据集选择id desc limit 1中,请将查询包装在外部查询中,并使用滞后和偏移来完成此操作

SELECT lag(timestamp_min)    OVER (ORDER BY timestamp_min) AS timestamp_min,
       lag(type)             OVER (ORDER BY timestamp_min) AS type,
       lag(sum_first_medium) OVER (ORDER BY timestamp_min),
FROM (SELECT to_timestamp(
                floor(
                   (extract('epoch' FROM TIMESTAMP) / 300)
                ) * 300
             ) AS timestamp_min,
             type,
             floor(sum(medium[1])) AS sum_first_medium
      FROM default_dataset
      WHERE type = 'ap_clients.wlan0'
        AND timestamp > current_timestamp - INTERVAL '85 minutes'
        AND organization_id = '9fc02db4-c3df-4890-93ac-8dd575ca5638'
      GROUP BY timestamp_min, type) lagme
OFFSET 2;

将您的查询包装在外部查询中,并使用lag和OFFSET来完成此操作

SELECT lag(timestamp_min)    OVER (ORDER BY timestamp_min) AS timestamp_min,
       lag(type)             OVER (ORDER BY timestamp_min) AS type,
       lag(sum_first_medium) OVER (ORDER BY timestamp_min),
FROM (SELECT to_timestamp(
                floor(
                   (extract('epoch' FROM TIMESTAMP) / 300)
                ) * 300
             ) AS timestamp_min,
             type,
             floor(sum(medium[1])) AS sum_first_medium
      FROM default_dataset
      WHERE type = 'ap_clients.wlan0'
        AND timestamp > current_timestamp - INTERVAL '85 minutes'
        AND organization_id = '9fc02db4-c3df-4890-93ac-8dd575ca5638'
      GROUP BY timestamp_min, type) lagme
OFFSET 2;

这可能有点长,但会完全按照您的要求执行

SELECT z.*
    FROM
(SELECT y.*, min(row_number) OVER(), max(row_number) OVER()
    FROM 
(SELECT x.*, row_number() OVER(ORDER BY timestamp_min)
   FROM 
(SELECT to_timestamp(floor((extract('epoch' FROM TIMESTAMP) / 300)) * 300) 
AS timestamp_min,
       TYPE,
       floor(sum(medium[1]))
FROM default_dataset
WHERE TYPE LIKE 'ap_clients.wlan0'
  AND TIMESTAMP > CURRENT_TIMESTAMP - interval '85 minutes'
  AND organization_id = '9fc02db4-c3df-4890-93ac-8dd575ca5638'
  AND id NOT IN
    (SELECT id
     FROM default_dataset
     ORDER BY TIMESTAMP DESC
     LIMIT 1)
GROUP BY timestamp_min,
         TYPE
ORDER BY timestamp_min ASC
) AS x
 ) AS y
 ) AS z WHERE row_number NOT IN (min, max)

这可能有点长,但会完全按照您的要求执行

SELECT z.*
    FROM
(SELECT y.*, min(row_number) OVER(), max(row_number) OVER()
    FROM 
(SELECT x.*, row_number() OVER(ORDER BY timestamp_min)
   FROM 
(SELECT to_timestamp(floor((extract('epoch' FROM TIMESTAMP) / 300)) * 300) 
AS timestamp_min,
       TYPE,
       floor(sum(medium[1]))
FROM default_dataset
WHERE TYPE LIKE 'ap_clients.wlan0'
  AND TIMESTAMP > CURRENT_TIMESTAMP - interval '85 minutes'
  AND organization_id = '9fc02db4-c3df-4890-93ac-8dd575ca5638'
  AND id NOT IN
    (SELECT id
     FROM default_dataset
     ORDER BY TIMESTAMP DESC
     LIMIT 1)
GROUP BY timestamp_min,
         TYPE
ORDER BY timestamp_min ASC
) AS x
 ) AS y
 ) AS z WHERE row_number NOT IN (min, max)

我得到了这个错误:记录类型还没有被注册正确,愚蠢的我。编辑后的答案应该更有效。错误:列id不存在第1行:选择lagtimestamp\u min而不是ORDER BY id,因为timestamp\u minIt有效,但是如果我有ap_clients.wlan0和ap_clients.wlan1,我想求和,我只需要在类似的条件下做,其中类型为'ap_clients.wlan%'?只要你理解我使用嵌套查询的模式,滞后和偏移,您应该能够根据自己的需要调整查询。我遇到了一个错误:记录类型尚未正确注册,傻瓜。编辑后的答案应该更有效。错误:列id不存在第1行:选择lagtimestamp\u min而不是ORDER BY id,因为timestamp\u minIt有效,但是,如果我有ap_clients.wlan0和ap_clients.wlan1,我想把这两个加起来,我只需要在类似于“ap_clients.wlan%”这样的条件下执行,只要您了解我使用的嵌套查询、滞后和偏移的模式,您就应该能够根据需要调整查询。