postgresql-过滤掉两行(但不是第一行和最后一行)
我遇到了一个“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 但我找不到办法解决我的问题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
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;)我写时间戳只是为了弄清楚这个列中存储了什么样的数据。@user3279298ts
老实说更糟;)很好的解决方案。但在这里,我必须在每一列中选择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
)