2017-08-22 11 views
0

SQL MAX SELECTはQuetionをCOUNT

id order_no 
1  O1  
1  O2 
2  O3 
2  O4 
3  O5 

と私は答えが

id max(count) 
1  2 
2  2 

ようにする必要があり、ほとんどの 注文者を見つけたいと、これは私のSQL

あるようなデータ・ベース
select order_user, MAX(times) 
from (select order_user, count(order_user) AS times 
     from labt04 
     group by order_user); 

しかし、それは単一のグループ機能を警告しません それを修正する? ANSI標準のSQLでは

答えて

3

SQL Serverを使用している場合は、あなたが欲しいものを手に入れるCommon Table Expressionを使用することができます。

WITH my_cte (my_id, times) 
AS 
(
    SELECT  my_id, COUNT(*) 
    FROM  labt04 
    GROUP BY my_id 
) 
SELECT  my_id, times 
FROM  my_cte 
WHERE  times = (SELECT MAX(times) FROM my_cte) 
+0

Oracle、Postgres、およびSQLiteでもCTEをサポートしています。ゴードンの答えがうまくいくならば、あなたのこともそうだ。 –

3

、あなたがrank()を使用します。

select order_user, times 
from (select order_user, count(*) AS times, 
      rank() over (order by count(*) desc) as seqnum 
     from labt04 
     group by order_user 
    ) 
where seqnum = 1; 
1

あなたが複数CTE + ROW_NUMBER() + MAX()を使用することができますSQLのステートメントは以下のようになります。

より早くなりますtop clause

;WITH Order_CTE_Row_Number_By_Id 
AS 
(
    SELECT  id, 
       Row_NUmber() over (Partition by id order by id) AS rowNumber_Id, 
       order_no 
    FROM  labt04 
), 
Order_CTE_Max_By_rowNumberById 
AS 
(
    SELECT  id, 
       Max(rowNumber_Id) over (order by rowNumber_Id desc) AS maxNumber_RowNumber_Id, 
       rowNumber_Id, 
       order_no 
    FROM  Order_CTE_Row_Number_By_Id 
) 
SELECT id, maxNumber_RowNumber_Id AS 'max(count)' 
FROM Order_CTE_Max_By_rowNumberById 
WHERE rowNumber_Id = maxNumber_RowNumber_Id