postgresql-过滤掉两行(但不是第一行和最后一行)

postgresql-过滤掉两行(但不是第一行和最后一行),sql,postgresql,Sql,Postgresql,我遇到了一个“postgres”SQL问题 我有一张像这样的桌子 id name level timestamp 1 pete 1 100 2 pete 1 200 3 pete 1 500 4 pete

我遇到了一个“postgres”SQL问题

我有一张像这样的桌子

id name level timestamp 1 pete 1 100 2 pete 1 200 3 pete 1 500 4 pete 5 900 7 pete 5 1000 9 pete 5 1200 15 pete 2 700 但我找不到办法解决我的问题

select id, name, level, timestamp
from (
  select id,name,level,timestamp,
         row_number() over (partition by name, level order by timestamp) as rn,
         count(*) over (partition by name, level) as max_rn
  from player_testing
) t
where rn = 1 or rn = max_rn;


顺便说一句:
timestamp
是一个可怕的列名称。一个原因是因为它是一个保留字,但更重要的是因为它没有记录列包含的内容。这是一个
start\u timestamp
end\u timestamp
a
有效吗,直到
,…?

这里有一个替代的解决方案来解决@a\u horse\u,在分区上没有
名称,因此更通用的SQL:

select * 
from player_testing as A
where id = (
  select min(id)
  from player_testing as B
  where A.name = B.name
  and A.level = B.level
  )
or    id = (
  select max(id)
  from player_testing as B
  where A.name = B.name
  and A.level = B.level
  )

这是显示它工作的小提琴:

在我的表中,它调用ts;)我写时间戳只是为了弄清楚这个列中存储了什么样的数据。@user3279298
ts
老实说更糟;)很好的解决方案。但在这里,我必须在每一列中选择A.xxx=B.xx。我有很多。在一匹没有名字的马上,我只需要列出列柱。问题是,哪个更快?我当时有240万行(只收集了几天),第一个解决方案大约需要3分钟才能找到(修改后)删除不需要的(两行)行。我也要测试通用的。好的,第二个需要非常长的时间。在一张清洁过的桌子上(左约150k行),第一种解决方案需要大约5秒钟来检查是否没有双行。第二个sql查询仍在运行(现在大约15分钟)。我认为,因为sql server必须检查140k行中的每一行是否有一个最小值和一个最大值具有相同的值(id、ts除外),所以比较起来大约是140k*2*140k。我不知道分区是如何工作的,但它要快得多。
select id, name, level, timestamp
from (
  select id,name,level,timestamp,
         row_number() over (partition by name, level order by timestamp) as rn,
         count(*) over (partition by name, level) as max_rn
  from player_testing
) t
where rn = 1 or rn = max_rn;
select * 
from player_testing as A
where id = (
  select min(id)
  from player_testing as B
  where A.name = B.name
  and A.level = B.level
  )
or    id = (
  select max(id)
  from player_testing as B
  where A.name = B.name
  and A.level = B.level
  )