T-SQL Получить один из списка, который включает пары значений - PullRequest
0 голосов
/ 03 октября 2018

У меня есть два набора данных:

id_description

id  description
1   The cat sat
2   The dog barked
2   The dog barked
3   The parrot
4   The dog barked
4   The dog barked

person_description

person  description
John    The cat sat
Jane    The dog barked
James   The parrot
Mary    The dog barked

Мне нужно создать третий набор данных, который выглядит следующим образом (любой из двухварианты ниже):

id  person  description
1   John    The cat sat
2   Jane    The dog barked
3   James   The parrot
4   Mary    The dog barked

id  person  description
1   John    The cat sat
2   Mary    The dog barked
3   James   The parrot
4   Jane    The dog barked

Я начинаю с попытки:

SELECT distinct a.id, b.person, a.description
FROM id_description a
LEFT OUTER JOIN person_description b ON a.description = b.description

В результате получается этот набор данных:

id  person  description
1   John    The cat sat
2   Jane    The dog barked
2   Mary    The dog barked
3   James   The parrot
4   Jane    The dog barked
4   Mary    The dog barked

Из-за объединения на description, person может быть продублировано для двух или более id номеров.Как мне добраться до моего целевого набора данных?

Каждое число person и id представляется один раз, и не имеет значения, к какому id присоединен person (т. Е. 2 ​​/ Джейн и 4 / Мэри эквивалентны 2 / Мэрии 4 / Джейн).Я пытался использовать row_number() over (partition by id order by person), а затем фильтровать по row_number = 1, но это привело к следующему:

id  person  description
1   John    The cat sat
2   Jane    The dog barked
3   James   The parrot
4   Jane    The dog barked

Мэри не представлена, потому что Джейн была строкой номер один для 2 и 4.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Если вы оказались здесь в результате объединения в Description, то одним из способов исправить это является получение ДВУХ row_numbers ().

Оба раздела в Description.

Одинупорядочено по идентификатору, другое упорядочено по персоне.

Затем выберите описания с идентификатором и лицом, чьи Row_Numbers совпадают.

В псевдо, это должно выглядеть примерно так:

with cte_ID AS (SELECT Description, ID, {RowNumber ordered by ID} AS ID_RN...)
,    cte_Person AS (SELECT Description, Person, {RowNumber ordered by Person} AS Person_RN...)
SELECT ID, Person, Description
FROM cte_ID JOIN cte_Person ON Description=Description AND ID_RN=Person_RN

Вы могли бы сделать это в исходном соединении, добавив row_numbers (разделение по Description) к каждой из ваших исходных таблиц и присоединившись как к Description, так и к Row_Number.

0 голосов
/ 03 октября 2018

использовать оконную функцию row_number

    with t as
(
select 1 as  id,'John' as person,'The cat sat' as des
union all
select 2 as  id,'Jane' as person,'The dog barked' 
union all
select 2 as  id,'Mary' ,'The dog barked' 
union all
select 3 , 'James' ,'The parrot'  
union all
select 4 , 'Jane' ,'The dog barked'  
union all
select 4 , 'Mary' ,'The dog barked'  

) select * from
(
select *,row_number() over(partition by des  order by id ) rn 
 from t
) as t1 where t1.rn=1
union
select * from
(
select *,row_number() over(partition by des  order by person ) rn 
 from t
) as t1 where t1.rn=1

id  person  des             rn
1   John    The cat sat     1
2   Mary    The dog barked  1
3   James   The parrot      1
4   Jane    The dog barked  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...