Sql 我想知道第二次参赛的日期和时间
我想在SQL中获得第二个条目Sql 我想知道第二次参赛的日期和时间,sql,greatest-n-per-group,Sql,Greatest N Per Group,我想在SQL中获得第二个条目 Consgno Name Entrydatetime 111 A 01/03/2017 10:10:15 111 A 01/03/2017 10:20:15 111 A 01/03/2017 11:10:20 222 B 02/03/2017 10:10:25 222 B 02/03/2017 11:10:3
Consgno Name Entrydatetime
111 A 01/03/2017 10:10:15
111 A 01/03/2017 10:20:15
111 A 01/03/2017 11:10:20
222 B 02/03/2017 10:10:25
222 B 02/03/2017 11:10:36
333 C 06/03/2017 10:10:25
333 C 07/03/2017 10:10:12
444 D 04/03/2017 10:10:41
444 D 04/03/2017 01:10:20
444 D 06/03/2017 10:10:32
一个Consgno已输入多个时间。
我想这样输出:
Consgno Name Entrydatetime
111 A 01/03/2017 10:20:15
222 B 02/03/2017 11:10:36
333 C 07/03/2017 10:10:12
444 D 04/03/2017 01:10:20
sql server/oracle/Postgres:
with CTE as
(
select MyTable.*, row_number() over(partition by consgno order by entrydatetime) as rn
from MyTable
)
select *
from CTE
where rn = 2
在查询中使用OFFSET命令
SELECT DISTINCT Consgno,Name,Entrydatetime FROM tbl_test ORDER BY
Consgno
LIMIT 1 OFFSET 1;
本例选择第二行。
Consgno必须是不同的您可以参考我的查询。希望能帮上忙,我的朋友:)) (仅在DB支持窗口分析函数的情况下工作) 在这种情况下,如果同一个
Consgno
可能会重复Entrydatetime
,并且您需要第二个日期时间,则可以使用:
select * from (
select MyTable.*,
dense_rank() over(partition by consgno order by entrydatetime) as rnk,
row_number() over(partition by consgno,entrydatetime order by entrydatetime) as rn
from MyTable
) t
where rnk = 2 and rn = 1
(请注意,如果consgno
每行都有相同的Entrydatetime
,则此查询根本不会返回consgno
。标记您正在使用的dbms。说到日期/时间,许多产品远远不符合ANSI SQL。列数据类型是否可能重复?格式是MM/DD/YYYY还是DD/MM/YYYY?列Entrydatetime类型是DD/MM/yyyyy。您需要将Entrydatetime
添加到订单中,由执行?当限制1
时,为什么选择DISTINCT
?(顺便说一句,您确定OP使用的dbms支持特定于供应商的限制吗?)。对于支持独特的的dbms,它将在没有限制的情况下工作。只是给出了一个一般的解决方案错误的根据预期的output@JohnHC:我已经测试过了,它按预期返回了输出,我的朋友!这次是的。对于更大的数据集,这不能保证它将返回OP暗示的第二次出现(按日期)output@JohnHC. 是的,你说得对。但他说他想在SQL中获得第二个条目,而不是依赖Entrydatetime字段。
select * from (
select MyTable.*,
dense_rank() over(partition by consgno order by entrydatetime) as rnk,
row_number() over(partition by consgno,entrydatetime order by entrydatetime) as rn
from MyTable
) t
where rnk = 2 and rn = 1