Nano Hash - криптовалюты, майнинг, программирование

Можно ли достичь такого результата с помощью рекурсивного cte?

В настоящее время у меня есть таблица, которая выглядит так:

| A_URN | B_URN | ID |
|-------|-------|----|
| 101   | 901   | 0  |
|-------|-------|----|
| 102   | 901   | 0  |
|-------|-------|----|
| 101   | 902   | 0  |
|-------|-------|----|
| 102   | 902   | 0  |
|-------|-------|----|
| 201   | 902   | 0  |
|-------|-------|----|
| 201   | 903   | 0  |
|-------|-------|----|
| 202   | 903   | 0  |
|-------|-------|----|
| 301   | 904   | 0  |
|-------|-------|----|
| 302   | 904   | 0  |
|-------|-------|----|
| 301   | 905   | 0  |
|-------|-------|----|
| 302   | 905   | 0  |
|-------|-------|----|
| 303   | 905   | 0  |
|-------|-------|----|
| 101   | 906   | 0  |

Мне нужно добавить идентификатор, который группирует все связанные элементы вместе.

Например, A_URN 101 подключен к B_URN 901, 902 и 906, а B_URN 901, 902 и 906 также содержат A_URN 102 и 201.

A_URN 201 также подключен к B_URN 903 и т.д. и т.п.

Конечный результат должен выглядеть примерно так:

| A_URN | B_URN | ID |
|-------|-------|----|
| 101   | 901   | 1  |
|-------|-------|----|
| 102   | 901   | 1  |
|-------|-------|----|
| 101   | 902   | 1  |
|-------|-------|----|
| 102   | 902   | 1  |
|-------|-------|----|
| 201   | 902   | 1  |
|-------|-------|----|
| 201   | 903   | 1  |
|-------|-------|----|
| 202   | 903   | 1  |
|-------|-------|----|
| 301   | 904   | 2  |
|-------|-------|----|
| 302   | 904   | 2  |
|-------|-------|----|
| 301   | 905   | 2  |
|-------|-------|----|
| 302   | 905   | 2  |
|-------|-------|----|
| 303   | 905   | 2  |
|-------|-------|----|
| 101   | 906   | 1  |

Я написал запрос, который выполняет это с помощью цикла WHILE(), но меня попросили переработать его в рекурсивное CTE. Я пытался, но всегда в конечном итоге нужно использовать MIN или GROUP BY внутри рекурсивного члена, что не разрешено.

Можно ли получить такой результат с помощью рекурсивного запроса?


  • Можете ли вы опубликовать решение с циклом while? 01.12.2016
  • Какую СУБД вы используете (MSSQL, Oracle)? 01.12.2016

Ответы:


1

Если вам нужно решение MSSQL с рекурсивным CTE. Вот запрос из моего ответа на аналогичный вопрос, адаптированный к вашему случаю:

WITH T as 
(
  SELECT A_URN,B_URN, ROW_NUMBER() OVER (ORDER BY A_URN) as ID FROM Table14
)
,CTE AS 
(
  SELECT CAST(','+CAST(A_URN AS Varchar(100)) +','+ CAST(B_URN as Varchar(100))+',' as Varchar(MAX)) as GroupCont,
        id
  FROM T
  UNION ALL
  SELECT CAST(GroupCont+CAST(A_URN AS Varchar(100)) +','+ CAST(B_URN as Varchar(100))+',' AS Varchar(MAX)) as GroupCont,
         pm.id
  FROM CTE 
  JOIN T as pm
  ON 
     (
       CTE.GroupCont LIKE '%,'+CAST(pm.A_URN AS Varchar(100))+',%'
       OR 
       CTE.GroupCont LIKE '%,'+CAST(pm.B_URN AS Varchar(100))+',%'
     )
     AND NOT  
     (
       CTE.GroupCont LIKE '%,'+CAST(pm.A_URN AS Varchar(100))+',%'
       AND 
       CTE.GroupCont LIKE '%,'+CAST(pm.B_URN AS Varchar(100))+',%'
     )
),
T1 AS 
(
 SELECT pm.A_URN,
       pm.B_URN,  
       ISNULL(
        (SELECT MAX(ID) FROM CTE WHERE 
        (
           CTE.GroupCont LIKE '%,'+CAST(pm.A_URN AS Varchar(100))+',%'
           OR 
           CTE.GroupCont LIKE '%,'+CAST(pm.B_URN AS Varchar(100))+',%'
        ))
        ,pm.ID) as ID
FROM T pm
)

SELECT A_URN,B_URN, 
       DENSE_RANK() OVER (ORDER BY ID) AS ID 
FROM T1
ORDER BY B_URN,A_URN
01.12.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..