1

我已经提到如何从表中获取第二大或第三大条目,但它只能通过查看最大值来返回。

但在这里我需要一个使用另一个字段的最大值的 sql 查询(这里的 id 是一个序列)。

这是表 my_test 在此处输入图像描述

我需要通过id获得sent_by的第二大唯一值,即100

我的查询似乎不太好,我试过了

SELECT sent_by
FROM MY_TEST
WHERE id =
     (SELECT MAX(id)
     FROM MY_TEST
     WHERE id NOT IN
          (SELECT id
          FROM MY_TEST
          WHERE sent_by =(SELECT sent_by FROM my_test WHERE id =(SELECT MAX(id) FROM MY_TEST))
          )
     ); -- results 100

有没有其他简单的方法来获得所需的?如果我需要获得第三个呢?

编辑

在这里,我将更新我的问题以使您更清楚。

让我们假设给定的表是消息事务的详细信息。让 id 是唯一的并且是(序列),sent_by 插入个人/人的 id(如 user_id)。sent_by 列可能/可能不会插入具有相同 user_id 的多行。

如果我需要获取最新的 sent_by 值:我可以查询

select sent_by from my_test where id= (select max(id) from my_test);-- to get 60

我的问题是取第二个最新的 sent_by 值:(在给定的表中,

the 2nd latest sent_by value should be 100, as id 8, 9, 10 are same sent_by values
the 3rd latest sent_by value should be 4, 
the 4th latest sent_by value should be 3

)

希望问题现在很清楚。

提前致谢:)

4

4 回答 4

4

如果我理解正确,请尝试以下操作:

select * 
from(
  select sent_by, row_number() over (order by sent_by desc, id asc) row_num
  from MY_TEST) t
where row_num = 2 -- or 3 ... n

更新

尝试这个:

select * 
from(
  select sent_by, 
         rank() over (order by max(id) desc)  rk
   from MY_TEST
  group by sent_by) t
where rk = 2 -- or 3 .. n

这是一个 sqlfiddle 演示

于 2013-04-17T07:16:46.383 回答
3

要找到第二个值,请尝试:

select * from(
  SELECT sent_by, row_number() over (order by sent_by desc) RNum
  FROM MY_TEST
  )x
WHERE RNum =2

第三

select * from(
  SELECT sent_by, row_number() over (order by sent_by desc) RNum
  FROM MY_TEST
  )x
WHERE RNum =3

是的......现在这提出了一个不同的问题。请检查我的尝试:

SELECT DISTINCT SENT_BY FROM(
  select ID, SENT_BY,  dense_rank() OVER(ORDER BY MaxID DESC) RNum FROM(
    SELECT ID, SENT_BY, max(ID) over (partition by sent_by order by ID desc) MaxID
    FROM MY_TEST
  )x
)xx where RNum=3
于 2013-04-17T06:43:39.817 回答
0

Analytic functions. ROW_NUMBER() OVER() NTH_VALUE

于 2013-04-17T06:46:29.717 回答
0

方法一:

select sent_by, rownum, from my_test where(rowid,0) in (select rowid, mod(rownum,4) from my_test);

这将每第 4 行返回一次。如果您想要随机行,请在 in 子句中用 rownums 替换子查询。

方法二:

select sent_by, rownum from (select sent_by , rownum  from MY_TEST) v1 where mod(v1.rownum,4)=0;

方法三:

select sent_by, rownum, from my_test group by sent_by, rownum having mod(rownum,n)=0 or rownum=2-n 

使用这些方法中的任何一种来选择第 5 行和第 9 行,这可以将第一种方法更改为以下

select sent_by, rownum, from my_test where rownum in(5,9);
于 2013-04-18T17:04:32.653 回答