首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql数据库,具有多个where,第二个最大

sql数据库,具有多个where,第二个最大
EN

Stack Overflow用户
提问于 2018-03-21 22:33:11
回答 3查看 52关注 0票数 0

我有一个名为数据库的表,其结构如下:

代码语言:javascript
复制
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值最高的行,我可以这样做:

代码语言:javascript
复制
select * 
from [database] 
where [ID] = 
(
    select max([ID])  
    from [database] 
    where [section] = 1
)

为了获得ID值第二高的行,我尝试了这一点,但是下面的数据返回ID为5的行,而我希望它返回ID 4的行。

代码语言:javascript
复制
select * 
from [database] 
where [ID]=
(
    select max([ID])-1  
    from [database] 
    where [section]=1
)

我正在尝试AND命令,但它不起作用。我是SQL和ASP的新手。我认为首先我需要对section = 1进行筛选,然后在本节中使用第二个最大/最高id;如下所示:

代码语言:javascript
复制
if( section == 1 && secMaximum )
{
.
.
.
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-22 08:15:33

富巴GordonLinoff的答案都很好,如果您使用MySql,它们都会工作。

在您提到的注释中,您使用的是Server (Management);这意味着您使用的是微软的SQL Server而不是MySQL,正如您在问题中标记的那样。注:这些是不同的产品,与SQL语言是相似的,两者有差异。

下面是MS Sql Server的解决方案:

代码语言:javascript
复制
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排序的;也就是说,SectionId最高的行是第1行,第二行是最高的第2行,等等。

如果我们只对样本数据运行下面的语句,我们就会得到以下结果:

代码语言:javascript
复制
    select *
    , Row_Number() over (partition by [Section] order by [Id] desc) MaxOrder
    from [Database]

代码语言:javascript
复制
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

其余的我想你会理解的,但是如果你有任何问题,请在评论中提出。

票数 0
EN

Stack Overflow用户

发布于 2018-03-21 23:04:44

如果需要第二个最大值,只需使用offset

代码语言:javascript
复制
select a.*
from [database] a
where a.section = 1
order by a.id desc
limit 1, 1;
票数 2
EN

Stack Overflow用户

发布于 2018-03-21 22:47:50

如果您为该节选择了两个最高的id值,然后选择这两个值中的最低值,则应该得到您想要的结果。

代码语言:javascript
复制
SELECT *
FROM (
  SELECT *
  FROM [database] a 
  WHERE section = 1
  ORDER BY id DESC
  LIMIT 2
) AS a1
ORDER BY id ASC
LIMIT 1

http://sqlfiddle.com/#!9/b413eb/3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49417613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档