SQL 查询以查找数据库中元素的第二次出现
SQL query to find the second occurrence of an element in a database
例如我有这个 table:
seenID | personID | seenTime
-------+----------+---------
108 3 13:34
109 2 13:56
110 3 14:22
111 3 14:31
112 4 15:04
113 2 15:52
我想获取第二次出现 PersonID
的行。
所以所需的输出需要是(对于其中一个人的 ID):
seenID | personID | seenTime
-------+----------+---------
110 3 14:22
这个场景的查询是什么?
对于一个特定的人
使用OFFSET
和LIMIT
。
select *
from mytable
where personid = 3
order by seentime
offest 1
limit 1;
(据我所知,曾经有一个名为 Presto 的 DBMS,有时也称为 PrestoDB 和 PrestoSQL。这分为两种不同的产品,Presto 和 Trino。如果您正在使用Trino,您可以用标准的 SQL FETCH
子句替换专有的 LIMIT
子句。)
每人
使用标准 SQL 的分析函数 ROW_NUMBER
对行进行编号,并保留所有编号为第二的行。
select seenid, personid, seentime
from
(
select
seenid, personid, seentime,
row_number() over (partition by personid order by seentime) as rn
from mytable
) numbered
where rn = 2
order by personid;
使用ROW_NUMBER() Function For this scenario
请参阅此 link 以了解如何以不同方式使用此功能
ROW_NUMBER()
查询在>SQL服务器(T-SQL)
SELECT seenID,personID,seenTime FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY personID ORDER BY personID) AS row_num,*
FROM "YourTableName"
)AS T
WHERE row_num = 2
例如我有这个 table:
seenID | personID | seenTime
-------+----------+---------
108 3 13:34
109 2 13:56
110 3 14:22
111 3 14:31
112 4 15:04
113 2 15:52
我想获取第二次出现 PersonID
的行。
所以所需的输出需要是(对于其中一个人的 ID):
seenID | personID | seenTime
-------+----------+---------
110 3 14:22
这个场景的查询是什么?
对于一个特定的人
使用OFFSET
和LIMIT
。
select *
from mytable
where personid = 3
order by seentime
offest 1
limit 1;
(据我所知,曾经有一个名为 Presto 的 DBMS,有时也称为 PrestoDB 和 PrestoSQL。这分为两种不同的产品,Presto 和 Trino。如果您正在使用Trino,您可以用标准的 SQL FETCH
子句替换专有的 LIMIT
子句。)
每人
使用标准 SQL 的分析函数 ROW_NUMBER
对行进行编号,并保留所有编号为第二的行。
select seenid, personid, seentime
from
(
select
seenid, personid, seentime,
row_number() over (partition by personid order by seentime) as rn
from mytable
) numbered
where rn = 2
order by personid;
使用ROW_NUMBER() Function For this scenario
请参阅此 link 以了解如何以不同方式使用此功能 ROW_NUMBER()
查询在>SQL服务器(T-SQL)
SELECT seenID,personID,seenTime FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY personID ORDER BY personID) AS row_num,*
FROM "YourTableName"
)AS T
WHERE row_num = 2