2014-10-20 30 views
0

您好,我无法弄清楚为以下表格和场景编写SQL查询的方式用于选择组中的组的SQL查询

假设我们有以下表格即viz。 LowestBid

ItemID  SuppplierID LowestBid 

A1     S1    10 
A1     S2    20 
A1     S3    30 
B1     S2    10 
B1     S3    20 
C1     S3    10 
C1     S1    20 
C1     S2    30 

假设我们有一个函数,它具有参数即viz。 N,预期的SQL查询的输出就像例如N = 1。 对于N = 1,我们需要为同一商品的出价值最低的每个商品找到一个供应商。

ItemID  SuppplierID LowestBid 

A1     S1    10 
B1     S2    10 
C1     S3    10 

如果N = 2 对于N = 2,我们需要找到其出价价值是相同的项目最低和第二低的投标值每件商品的供应商。

ItemID  SuppplierID LowestBid 

A1     S1    10 
A1     S2    20 
B1     S2    10 
B1     S3    20 
C1     S3    10 
C1     S1    20 
+0

要清楚,你想要的最低投标ñp呃物品? – 2014-10-20 05:26:09

+3

你正在使用哪个DBMS? – DirkNM 2014-10-20 05:26:16

+0

@JoshSmeaton是的,你是对的。 – 2014-10-20 05:39:55

回答

2

如果你使用的是Postgres或具有分析/窗口功能的另一个RDBMS,你可以使用row_number来过滤行你感兴趣的:

select 
    q.item_id, 
    q.supplier_id, 
    q.bid 
from (
select 
    item_id, 
    supplier_id, 
    bid, 
    row_number() over (partition by item_id order by bid) as row_num 
from bids) q 
where q.row_num <= 2 -- N=2; 

产地:

ITEM_ID SUPPLIER_ID BID 
1  1   10 
1  2   20 
2  3   10 
2  1   20 
3  2   10 
3  3   20 

在这里看到的小提琴:http://sqlfiddle.com/#!3/ce3a1/1

+0

它的工作和解决了我的问题。非常感谢。你能否建议我,我怎样才能提高我的编写SQL查询的技能。 – 2014-10-20 06:13:51

+0

@maheshcs只是很多练习。如果您对定期查询和聚合相当有信心,请查看分析查询和窗口函数以获取更高级的内容。 – 2014-10-20 12:31:26

+0

非常感谢你的建议。 – 2014-11-20 13:26:57