我有一个名为[database]的表,其结构如下:
ID|text|section|
1 |xxxx| 1 |
2 |xxxx| 2 |
3 |xxxx| 2 |
4 |xxxx| 1 |
5 |xxxx| 4 |
6 |xxxx| 1 |
我正在尝试编写SQL,它返回给定部分ID值第二高的行。
即。要获得第1部分中id值最高的行,我可以这样做:
select *
from [database]
where [ID] =
(
select max([ID])
from [database]
where [section] = 1
)
要获取ID值第二高的行,我尝试了这个,但是下面的数据会返回ID为5的行,而我希望它返回ID为4的行。
select *
from [database]
where [ID]=
(
select max([ID])-1
from [database]
where [section]=1
)
我正在尝试AND
命令,但它不起作用。
我是SQL和ASP的新手。
我认为首先我需要在section = 1
上进行过滤,然后在此部分中进行第二次最高/最高id
。类似的东西:
if( section == 1 && secMaximum )
{
.
.
.
}
答案 0 :(得分:2)
如果您需要第二个最大值,请使用offset
:
select a.*
from [database] a
where a.section = 1
order by a.id desc
limit 1, 1;
答案 1 :(得分:1)
如果您为该部分选择了两个最高id
值,然后选择这两个中的最低值,则应获得所需的结果。
SELECT *
FROM (
SELECT *
FROM [database] a
WHERE section = 1
ORDER BY id DESC
LIMIT 2
) AS a1
ORDER BY id ASC
LIMIT 1
答案 2 :(得分:0)
Fubar和GordonLinoff的答案都非常好,如果您正在使用MySql,它们都会有效。
在您提到的评论中,您使用的是SQL Server(Management)Studio;这意味着您使用的是Microsoft's SQL Server而不是MySQL,因为您已在问题中添加了标记。注意:这些是不同的产品,并且两者的SQL
语言相似,但存在差异。
这是MS Sql Server的解决方案:
select [Id], [Text], [Section]
from
(
select *
, Row_Number() over (partition by [Section] order by [Id] desc) MaxOrder
from [Database]
where [Section] = 1
) x
where MaxOrder = 2
您可以在此处试用:http://sqlfiddle.com/#!18/4dfce/2
您可能会理解上面的大部分SQL。
令人困惑的部分是Row_Number() over (partition by [Section] order by [Id] desc)
,所以这里有一个解释。
row_number()
只是一个增量数字;即返回的第一行是1,第二行是2,依此类推,直到“分区”结束(见下一点)。partition by
创建分区;这里我们按Section
进行分区,因此对于Section = 1
的行,row_number()
会返回1,2,3等,那么对于那些Section = 2
的行,{ {1}}返回1,2等等。row_number()
说明如何确定分区内的编号方式;即哪一行应该得到数字1,等等。这里我们按order by
订购;即Id desc
中Id
最高的行是第1行,第2行是第2行,等等。如果我们只对您的样本数据运行以下声明,我们会得到以下结果:
Section
select *
, Row_Number() over (partition by [Section] order by [Id] desc) MaxOrder
from [Database]
您可以在此处看到:http://sqlfiddle.com/#!18/4dfce/3
其余我认为你理解;但如果您有任何问题,请在评论中提出。