我想检索第二行的结果,我看到了这个问题:
How can I retrieve second last row?
但它使用的顺序在我的情况下不起作用,因为Emp_Number列包含行数和日期时间戳,如果我使用order by,则混合数据。
第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功能的情况下获得第二个最后一行值?
答案 0 :(得分:1)
无法保证 count 将在最后一行返回,因为没有定义明确的顺序。即使这些记录以正确的顺序编写,引擎也可以按任何顺序自由返回记录,除非您指定order by
子句。但显然你没有专栏来插入该条款来重现预期的顺序。
我提出这些解决方案:
select min(Emp_Number * 1)
from DAT_history
where Emp_Number not regexp '[^0-9]'
请参阅SQL Fiddle
当计数大于最小员工编号时,这显然会失败。但是看到样本数据,这可能代表了许多可能没有预期的记录......
select count(*)-2
from DAT_history
请参阅SQL Fiddle
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