10

以下は私のテーブルです

表1

+--------+----------+---------+  
| amount | make     | product |  
+--------+----------+---------+  
|    100 | Nokia    | Mobiles |   
|    300 | Samesung | Mobiles |   
|    700 | Micromax | Mobiles |   
|   1000 | Karbonn  | Mobiles |   
|    500 | Lava     | Mobiles |   
|    100 | Floyer   | Gift    |   
|    500 | Arichies | Gift    |   
|    300 | Feeling  | Gift    |   
+--------+----------+---------+  

ここで、各製品の最高額を 2 つ表示したいと思います...

したがって、以下のような結果が得られる単一の SQL クエリを作成したいと思います。

+--------+----------+---------+  
| amount | make     | product |  
+--------+----------+---------+  
|   1000 | Karbonn  | Mobiles |   
|    700 | Micromax | Mobiles |   
|    500 | Arichies | Gift    |   
|    300 | Feeling  | Gift    |   
+--------+----------+---------+  

そのようなクエリを作成するのを手伝ってください..

4

5 に答える 5

10

このソリューションを使用して、以下に基づいて「グループごとの最大値amount」を取得できます。

SELECT a.*
FROM Table1 a
INNER JOIN Table1 b ON a.product = b.product AND a.amount <= b.amount
GROUP BY a.amount, a.product
HAVING COUNT(*) <= 2

製品ごとに取得したい上位2行の数に変更するだけです。

製品ごとに最下位の 2 行を取得したい場合は、 の<=記号を に変更INNER JOINするだけ>=です。

ここでこのソリューションをいじることができます: SQL-Fiddle Demo

于 2012-07-10T06:26:55.530 に答える
4
select product, make, amount, rnk
from (
  select l.product, l.make, l.amount, count(*) as rnk
  from table1 as l
  left join table1 as r
  on (r.product = l.product and l.amount <= r.amount) 
  group by l.product, l.make
) a
where rnk <= 2

ここでアイデアと他の例を参照してください:http://www.xaprb.com/blog/2005/09/27/simulating-the-sql-row_number-function/

zane bien テスト データに基づくSQL フィドル。

于 2012-07-10T06:26:15.580 に答える
1
SELECT a.*
FROM Table1 a
INNER JOIN Table1 b ON a.product = b.product AND a.amount <= b.amount
GROUP BY a.amount, a.product
HAVING COUNT(*) <= 2
ORDER BY a.amount desc

http://sqlfiddle.com/#!2/9ba82/1を参照してください

于 2012-07-10T06:33:58.707 に答える
0
select top 2 amount, make, product from table1 
where product='Mobiles'
order by amount desc
union
select top 2 amount, make, product from table1 
where product='Gift'
order by amount desc
于 2012-07-10T06:24:29.090 に答える
0

2 つの方法でそれを行うことができます: 1) 順序を反映する行インデックス列を追加し、行 <= 2 のすべての行を選択します。

SELECT amount, make,product
FROM 
(SELECT  ROW_NUMBER() OVER (PARTITION BY [product] ORDER BY [amount] DESC) AS [RowID],*
FROM [dbo].[Table1]) RESULT
WHERE RowID <= 2

2)テーブルをそれ自体に結合することもできます

SELECT a1.* FROM Table1 AS a1
  LEFT JOIN Table1 AS a2 
    ON a1.product = a2.product AND a1.amount<= a2.amount
GROUP BY a1.product
HAVING COUNT(*) <= 2;
于 2012-07-10T06:27:37.793 に答える