我有一个名为数据库的表,其结构如下:
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 )
{
.
.
.
}发布于 2018-03-22 08:15:33
富巴和GordonLinoff的答案都很好,如果您使用MySql,它们都会工作。
在您提到的注释中,您使用的是Server (Management);这意味着您使用的是微软的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的行,row_number()返回1、2等等。order by告诉我们如何决定编号是如何在分区内发生的;也就是说,哪一行应该得到1,等等。这里我们是通过Id desc排序的;也就是说,Section中Id最高的行是第1行,第二行是最高的第2行,等等。如果我们只对样本数据运行下面的语句,我们就会得到以下结果:
select *
, Row_Number() over (partition by [Section] order by [Id] desc) MaxOrder
from [Database]
Id | Text | Section | MaxOrder
6 | xxxx | 1 | 1
4 | xxxx | 1 | 2
1 | xxxx | 1 | 3
3 | xxxx | 2 | 1
2 | xxxx | 2 | 2
5 | xxxx | 4 | 1您可以在这里看到这一点:http://sqlfiddle.com/#!18/4dfce/3
其余的我想你会理解的,但是如果你有任何问题,请在评论中提出。
发布于 2018-03-21 23:04:44
如果需要第二个最大值,只需使用offset
select a.*
from [database] a
where a.section = 1
order by a.id desc
limit 1, 1;发布于 2018-03-21 22:47:50
如果您为该节选择了两个最高的id值,然后选择这两个值中的最低值,则应该得到您想要的结果。
SELECT *
FROM (
SELECT *
FROM [database] a
WHERE section = 1
ORDER BY id DESC
LIMIT 2
) AS a1
ORDER BY id ASC
LIMIT 1http://sqlfiddle.com/#!9/b413eb/3
https://stackoverflow.com/questions/49417613
复制相似问题