Postgresql 忽略查询结果中的第一行和最后一行
我正在尝试执行一个查询,希望忽略结果查询的第一行和最后一行 我的结果查询是检索过去一小时内按5分钟分组的所有介质的总和 要忽略我使用offset1的第一条记录,要忽略最后一条记录,我试图在我的id字段中进行限制,按时间戳desc排序 我的问题是:Postgresql 忽略查询结果中的第一行和最后一行,postgresql,Postgresql,我正在尝试执行一个查询,希望忽略结果查询的第一行和最后一行 我的结果查询是检索过去一小时内按5分钟分组的所有介质的总和 要忽略我使用offset1的第一条记录,要忽略最后一条记录,我试图在我的id字段中进行限制,按时间戳desc排序 我的问题是: ws_controller_hist=> SELECT to_timestamp(floor((extract('epoch' FROM TIMESTAMP) / 300)) * 300) AS timestamp_min,
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%”这样的条件下执行,只要您了解我使用的嵌套查询、滞后和偏移的模式,您就应该能够根据需要调整查询。