1

テーブルから 2 番目に大きいエントリまたは 3 番目に大きいエントリを取得する方法を参照しましたが、最大値を調べることによってのみ返されます。

しかし、ここでは別のフィールドの最大値を使用するSQLクエリが必要です(ここではシーケンスであるid)。

ここにテーブル my_test があります ここに画像の説明を入力

sent_byの 2 番目に大きい一意の値、つまりIDから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

必要なものを取得する他の簡単な方法はありますか?3番目を取得する必要がある場合はどうですか?

編集

ここで、より明確にするために質問を更新します。

与えられたテーブルがメッセージ トランザクションの詳細であると仮定します。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

私の質問は、2 番目に新しい 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

2 番目の値を見つけるには、次を試してください。

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

分析関数。ROW_NUMBER () OVER() NTH_VALUE

于 2013-04-17T06:46:29.717 に答える
0

方法 1:

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

これは 4 行ごとに返されます。ランダムな行が必要な場合は、サブクエリを in 句の rownums に置き換えます。

方法 2:

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

方法 3:

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 に答える