SQL: выбор первой встречающейся строки повторяющегося значения - PullRequest
0 голосов
/ 05 декабря 2018

Из следующего кода:

SELECT
farm_products.id as ID,  
farm_products.product as Product1,  
shop_products.product as Product2
FROM  
farm_products,  
shop_products,  
shop_farm
WHERE
farm_products.id = shop_farm.farm_id and
shop_farm.farm_id = shop_products.id and 
farm_products.product != shop_products.product;

Я получаю следующий вывод:

+-------+----------+---------+
|ID     | Product1 | Product2|
+-------+----------+---------+
|06     | 'Apple'  | 'Grape' |
+-------+----------+---------+
|06     | 'Orange' | 'Grape' |
+-------+----------+---------+
|06     | 'Pear'   | 'Apple' |
+-------+----------+---------+
|07     | 'Apple'  | 'Pear'  |
+-------+----------+---------+
|08     | 'Kiwi'   | 'Grape' |
+-------+----------+---------+
|08     | 'Grape'  | 'Orange |
+-------+----------+---------+

Я хочу иметь таблицу, в которой только первая встречающаяся строка каждого
ID

Другими словами, я хочу вывод, который выглядит следующим образом:

+-------+----------+---------+
|ID     | Product1 | Product2|
+-------+----------+---------+
|06     | 'Apple'  | 'Grape' |
+-------+----------+---------+
|07     | 'Apple'  | 'Pear'  |
+-------+----------+---------+
|08     | 'Kiwi'   | 'Grape' |
+-------+----------+---------+

Я пытался использовать DISTINCT , чтобы удалить все повторяющиеся идентификаторы,но это (очевидно) не сработало.Я хочу попытаться избежать вложенных запросов и сделать код как можно более простым.

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

это будет работать:

select * from (SELECT
farm_products.id as ID,  
farm_products.product as Product1,  
shop_products.product as Product2,
row_number() over(partition by farm_products.id order by 
farm_products.id) rank 
FROM  
farm_products,  
shop_products,  
shop_farm
WHERE
farm_products.id = shop_farm.farm_id and  
shop_farm.farm_id = shop_products.id and  
farm_products.product != shop_products.product)
where rank=1
;
0 голосов
/ 05 декабря 2018

используйте row_number()

select * from 
(select *, row_number() over( partition by id order by Product1 ) rn
from table_name
)t where rn=1

Вы можете использовать свой запрос ниже, как

 with cte as
(
SELECT
farm_products.id as ID,  
farm_products.product as Product1,  
shop_products.product as Product2,
row_number() over(partition by farm_products.id order by 
 farm_products.product) rn 
FROM  
farm_products join 
shop_products on farm_products.product != shop_products.product
join shop_farm on shop_farm.farm_id = shop_products.id
and farm_products.id = shop_farm.farm_id   

) select * from cte where rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...