2014-10-20 2 views
0

Здравствуйте, я не могу понять, как писать SQL-запрос для следующей таблицы и сценарияSQL-запрос для выбора групп в группах

Допустим, у нас есть следующая таблица: 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

Чтобы быть ясно, вы хотите наименьшую N торги р er Item? –

+3

Какая СУБД вы используете? – DirkNM

+0

@ JoshSmeaton Да, вы правы. –

ответ

2

Если вы используете Postgres или другой РСУБД, что имеет аналитические/оконные функции, вы можете использовать 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-запросы. –

+0

@maheshcs просто много практики. Если вы достаточно уверены в регулярных запросах и агрегатах, изучите аналитические запросы и функции окна для более продвинутых материалов. –

+0

Большое спасибо за предложение. –