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

这个场景的查询是什么?

对于一个特定的人

使用OFFSETLIMIT

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