如何在mySql中选择Second Last Row?

时间:2016-08-22 14:29:41

标签: sql-server ssms

我想检索第二行的结果,我看到了这个问题:

How can I retrieve second last row?

但它使用的顺序在我的情况下不起作用,因为Emp_Number列包含行数和日期时间戳,如果我使用order by,则混合数据。

Table View

第22行和第23行包含总行数(不包括第21行和第22行)以及分别输入的时间和日期。

我使用此查询返回所需的结果21但如果此数字增加则会导致错误

SELECT TOP 1 * 
FROM(
    SELECT TOP 2 * 
    FROM DAT_History
    ORDER BY Emp_Number ASC 
    ) t                     
ORDER BY Emp_Number desc

有没有办法在不使用Order By功能的情况下获得第二个最后一行值?

2 个答案:

答案 0 :(得分:1)

无法保证 count 将在最后一行返回,因为没有定义明确的顺序。即使这些记录以正确的顺序编写,引擎也可以按任何顺序自由返回记录,除非您指定order by子句。但显然你没有专栏来插入该条款来重现预期的顺序。

我提出这些解决方案:

1。返回表示正整数

的最小值
select min(Emp_Number * 1)
from   DAT_history 
where  Emp_Number not regexp '[^0-9]'

请参阅SQL Fiddle

当计数大于最小员工编号时,这显然会失败。但是看到样本数据,这可能代表了许多可能没有预期的记录......

2。计算记录,忽略2个聚合记录

select count(*)-2
from   DAT_history 

请参阅SQL Fiddle

3。依靠没有order by

的正确顺序

正如开头所解释的那样,你不能依赖顺序,但如果由于某种原因你仍然想要依赖它,你可以使用一个变量来对子查询中的行进行编号,然后选择那个归因于一个但是最后一个数字:

select Emp_Number * 1
from   (select Emp_Number,
               @rn := @rn + 1 rn
        from   DAT_history,
               (select @rn := 0) init        
       ) numbered
where  rn = @rn - 1

请参阅SQL Fiddle

添加* 1以将文本转换为数字数据类型。

答案 1 :(得分:0)

这不是一个完美的解决方案。我正在为此做出一些假设。检查这是否适合您。

;WITH cte 
     AS (SELECT emp_number, 
                Row_number() 
                  OVER ( 
                    ORDER BY emp_number ASC) AS rn 
         FROM   dat_history 
         WHERE  Isdate(emp_number) = 0) --Omit date entries
SELECT emp_number 
FROM   cte 
WHERE  rn = 1 -- select the minimum entry, assuming it would be the count and assuming count might not exceed the emp number range of 9888000