2016-02-05 169 views
2

我想从tblTask​​s(JobID,ItemName,ContentTypeID)中选择第二个最高值选择第二个MAX值

这就是我的看法。我敢打赌,它可以做得更容易,但我不知道如何。

SELECT Max(JobID) AS maxjobid, 
     Max(ItemName) AS maxitemname, 
     ContentTypeID 
FROM 
     (SELECT JobID, ItemName, ContentTypeID 
     FROM tblTasks Ta 
     WHERE JobID NOT IN 
      (SELECT MAX(JobID) 
      FROM tblTasks Tb 
      GROUP BY ContentTypeID) 
      ) secmax 

    GROUP BY secmax.ContentTypeID 
+2

第二高的价值是什么?样本数据和期望的结果将有所帮助。 –

回答

2

我猜你会想要这样的事情。

SELECT JobID AS maxjobid, 
     ItemName AS maxitemname, 
     ContentTypeID 
FROM (SELECT JobID, 
       ItemName, 
       ContentTypeID, 
       ROW_NUMBER() OVER (PARTITION BY ContentTypeID ORDER BY JobID DESC) Rn 
     FROM tblTasks Ta 

     ) t 
WHERE Rn = 2 

这将给你每ContentTypeID第二高的JobID记录

0

您可以使用语法如下:

SELECT MAX(col) 
FROM table 
WHERE col < (SELECT MAX(col) 
      FROM table) 
1

我建议DENSE_RANK(),如果你想在第二JobID

SELECT tb.* 
FROM (SELECT tb.*, DENSE_RANK() OVER (ORDER BY JobID DESC) as seqnum 
     FROM tblTasks Tb 
    ) tb 
WHERE seqnum = 2; 

如果没有重复,然后OFFSET/FETCH更容易:

SELECT tb.* 
from tblTasks 
ORDER BY JobId 
OFFSET 1 
FETCH FIRST 1 ROW ONLY; 
+0

是否有匿名downvote的原因? –

+0

不是我downvote,但你忽略了'GROUP BY secmax.ContentTypeID',这使'OFFSET/FETCH'解决方案有点难。 –

+0

@Aツ。 。 。我无法分辨OP的查询中“GROUP BY”的意图。这种方式我最初的理解是什么查询似乎在做什么。 OP可能希望为每个内容添加第二个jobid,但我正在等待澄清。 –

0
SELECT * FROM tblTasks ORDER BY col DESC LIMIT 1, 1 
相关问题