2016-12-10 10 views
0

LIMIT内でサブクエリを使用できるかどうかは疑問でした。LIMIT内のMYSQLサブクエリ

私がこれを使用したい理由は、最良の購入顧客の20%(1/5)を返すことです。例えば

(これは明らかに動作しませんが):

SELECT id, revenue 
FROM customers 
ORDER BY revenue DESC 
LIMIT (SELECT (COUNT(*)/5) FROM customer) 

制限にサブクエリを作る、または別の方法では20%を返す方法はありますか?

+0

http://stackoverflow.com/questions/4741239/select-top-x-or-bottom-percent-for-numeric-values-in-mysqlます。http:// stackoverflowの。 com/questions/4741239/select-top-x-or-bottom-percent-for-numeric-values-in-mysql –

+2

ご使用のデータベースに質問にタグを付けてください。 –

答えて

0

ANSI SQLを使用してこれを行うの典型的な方法は、ウィンドウ関数である:

SELECT id, revenue 
FROM (SELECT c.*, 
      ROW_NUMBER() OVER (ORDER BY revenue DESC) as seqnum, 
      COUNT(*) OVER() as cnt 
     FROM customers 
    ) c 
WHERE seqnum <= cnt * 0.2 
ORDER BY revenue DESC; 

ほとんどのデータベースには、これらの機能をサポートしています。

MySQLは、ウィンドウ機能をサポートしていない数少ないデータベースの1つです。あなたは、変数を使用することができます。

SELECT id, revenue 
FROM (SELECT c.*, (@rn := @rn + 1) as rn 
     FROM customers c CROSS JOIN 
      (SELECT @rn := 0) params 
     ORDER BY c.revenue DESC 
    ) c 
WHERE rn <= @rn/5; -- The subquery runs first so @rn should have the total count here. 
+0

それは私にとってはうまくいかない。私は にROW_NUMBER()OVER(ORDER BY収入DESC)というエラーをseqnumとして取得します。 MYSQLを使用している可能性がありますか? – Colin

+0

@コリン。 。 。はい、それが私が答えを編集した理由です。 –

+0

ありがとう、うわー、その作品。しかし、私は実際のテーブルのためにそれを編集するつもりです。 – Colin