sql数据库,有多个where,second max

时间:2018-03-21 22:33:11

标签: mysql sql

我有一个名为[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 )
{
.
.
.
}

3 个答案:

答案 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

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

答案 2 :(得分:0)

FubarGordonLinoff的答案都非常好,如果您正在使用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 descId最高的行是第1行,第2行是第2行,等等。

如果我们只对您的样本数据运行以下声明,我们会得到以下结果:

Section

    select *
    , Row_Number() over (partition by [Section] order by [Id] desc) MaxOrder
    from [Database]

您可以在此处看到:http://sqlfiddle.com/#!18/4dfce/3

其余我认为你理解;但如果您有任何问题,请在评论中提出。