Удалить дубликаты при объединении других значений столбцов - PullRequest
0 голосов
/ 25 апреля 2019

Моя таблица данных выглядит следующим образом (Таблица1)

            Table1
            ------------------------------------------
            ID  | IPaddress     | Port  | Value
            ----|---------------|-------|-------------      
            1   | xx.yy.14.15   | 332   | This is good
            ------------------------------------------      
            2   | xx.yy.14.15   | 332   | I can work
            ------------------------------------------
            3   | xx.yy.12.12   | 400   | Looks ok
            ------------------------------------------
            4   | xx.yy.12.12   | 400   | can I work
            ------------------------------------------
            5   | xx.yy.12.12   | 400   | Yes, please
            -------------------------------------------
            6   | xx.yy.14.16   | 401   | How is this
            -------------------------------------------
            7   | xx.yy.14.16   | 401   | Looks ok
            -------------------------------------------
            8   | xx.yy.14.16   | 401   | can I work
            -------------------------------------------
            9   | xx.yy.14.16   | 401   | Yes, please
            -------------------------------------------

Таблица желаемых результатов:

            ID  | IPaddress     | Port  | Value
            ----|---------------|-------|-----------------------------------------------------------        
            1   | xx.yy.14.15   | 332   | This is good and I can work
            --------------------------------------------------------------------------------------      
            2   | xx.yy.12.12   | 400   | Looks ok and can I work and Yes, please
            ---------------------------------------------------------------------------------------
            3   | xx.yy.14.16   | 401   | How is this and Looks ok and can I work and Yes, please
            ---------------------------------------------------------------------------------------

Вот что я попробовал:

            DECLARE @VAR1 VARCHAR(50)
            DECLARE @VAR2 VARCHAR(50)

            SELECT @VAR1 = T1.VALUE,@VAR2=T2.VALUE
            FROM TABLE1 AS T1 INNER JOIN TABLE1 AS T2 ON T1.ID =T2.ID
            WHERE T1.IPADDRESS =T2.IPADDRESS

            SELECT IPADDRSS,PORT,@VAR1 + ' AND ' +@VAR2 FROM
              SELECT T1.*,
              ROW_NUMBER() OVER (PARTITION BY T1.IPADDRESS,T1.PORT ORDER BY VALUE) AS NM
              FROM TABLE1 AS T1
              )TBL
            WHERE NM = 1

Однако из вышеприведенного запроса я могу получить желаемый результат, если есть только 2 повторяющихся строки (ПРИМЕЧАНИЕ: здесь я рассматриваю IPADDRESS и PORT как дубликаты, в то время как другие столбцы не дублируются)

Однако, как я могу достичь желаемого результата, когда одинаковые IPADDRESS и PORT находятся в 3, 4 или 5 строках? Обратите внимание, что число строк, имеющих одинаковые IPADDRESS и PORT, является динамическим и иногда может превышать 10. Итак, как я могу справиться с такой динамичной ситуацией, получая желаемый результат?

Надеюсь, я все правильно объяснил. Пожалуйста помоги. Спасибо

Ответы [ 4 ]

2 голосов
/ 25 апреля 2019

Только что увидел ваш комментарий по поводу SQL 2017. Если бы я сказал это заранее, я работал над техникой агрегации старой школы, которая меня расстраивала.SQL 2017 предоставил нам давно просроченную функцию string_agg, которая упрощает ее работу:

SELECT
   row_number() over (order by IPaddress, Port) ID
  ,IPaddress
  ,Port
  ,string_agg(Value, ' and ')
 from Table1
 group by 
   IPaddress
  ,Port

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

@ Версия KeithL работаеттоже, с небольшой отладкой ... которую я вижу, вы только что отработали.Я просто не очень люблю XML, поэтому я работал над альтернативой.

1 голос
/ 25 апреля 2019

Это ответ для создания списка с разделителями (обычно запятая, но в вашем случае 'и' с разделителями)

попробуйте использовать материал в этом столбце

select rownumber() over (order by IPAddress,Port),IPAddress,Port
    ,stuff((select ' and ' + value
            from table t2
            where t1.IPaddress=t2.ipaddress and t1.port=t2.port
            order by ID
            for XML path(''), type
            ).value('.','nvarchar(max)')
            ,1,len(' and '),'') as verbage
from table t1
group by IPAddress,Port

Как это работает:

внешний запрос в основном возвращает групповой результат по IP-адресу, порт

коррелированный подзапрос предоставляет список с разделителями для каждой строки, связанной с IP-адресом, порт

логика вещей состоит в том, чтобы удалить первые 'и'

0 голосов
/ 26 апреля 2019
SELECT
    t1.IpAddress,t1.port,

    value = STUFF((
        SELECT ' and ' + t2.value
        FROM Table1 t2
        WHERE t1.port = t2.port
        FOR XML PATH('')
    ),2, 3, '')
FROM Table1 t1
GROUP BY t1.port,t1.IpAddress

enter image description here

0 голосов
/ 26 апреля 2019

Вы можете попробовать это:

select t.* from (
select ROW_NUMBER() over (partition by port order by port) rn,id,port,value=stuff ( 
                         ( select ' ' + value from @t t
                         where t.port=t1.port
                                    for xml path ('')),1,1,''

                         ) from @t t1
                         group by id,port
) t
where rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...