Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти полное вхождение / 6 сообщений из 6, страница 1 из 1
21.02.2019, 07:52
    #39777080
r.r3d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
Есть таблица вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @t table (id int, elementid int)

insert into @t(id, elementid)
values(1, 1),
(1, 2),
(1, 3),
(2, 1),
(2, 2),
(2, 3),
(3, 1),
(3, 2),
(4, 5),
(5, 5)



Необходимо вывести все пары ID этой таблицы, в которых есть полное пересечение по полю elementid.
В примере это
1, 2 (полное пересечение по elementid = 1, 2, 3)
4, 5 (полное пересечение по elementid = 5)

Как это сделать?
...
Рейтинг: 0 / 0
21.02.2019, 07:58
    #39777082
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
r.r3d,

почитать про реляционное деление?
...
Рейтинг: 0 / 0
21.02.2019, 08:14
    #39777086
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
r.r3d,

но как вариант - можно посмотреть и в сторону полного соединения (FULL JOIN)
...
Рейтинг: 0 / 0
21.02.2019, 09:30
    #39777097
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
r.r3d,

Что такое полное пересечение по elementid ? Я не понял почему именно эти пары Вы отобрали. Опишите алгоритм пожалуйста
...
Рейтинг: 0 / 0
21.02.2019, 11:46
    #39777162
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
r.r3d,

соедините выбирайте из таблицы записи, если существуют строки этой же таблицы экземпляра, граничные значения которых полностью покрываются границами первого. Т.е. exists () выражение.
...
Рейтинг: 0 / 0
22.02.2019, 10:32
    #39777758
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти полное вхождение
r.r3d,

как-то так + string_agg на них натравить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
DECLARE 
  @t TABLE ( [id] INT, [elementid] INT )
;
INSERT
INTO 
  @t( [id], [elementid] )
VALUES
  ( 1, 1 ),
  ( 1, 2 ),
  ( 1, 3 ),
  ( 2, 1 ),
  ( 2, 2 ),
  ( 2, 3 ),
  ( 3, 1 ),
  ( 3, 2 ),
  ( 4, 5 ),
  ( 5, 5 )
;
WITH
t1 AS (
  SELECT
    [id],
    [min] = MIN( [elementid] ),
    [max] = MAX( [elementid] ),
    [cnt] = COUNT( [elementid] )
  FROM
    @t 
  GROUP BY
    [id]
),
t2 AS (
  SELECT
    *,
    [rn]  = DENSE_RANK()
            OVER (
              PARTITION BY 
                [min],
                [max],
                [cnt]
              ORDER BY
                [id] )
  FROM
    t1
),
t3 AS (
  SELECT
    [min],
    [max],
    [cnt],
    [gr] = ROW_NUMBER() OVER ( ORDER BY 1/0 )
  FROM
    t2
  GROUP BY
    [min],
    [max],
    [cnt]
  HAVING
    MAX( [rn] ) > 1
)
SELECT
  t3.[gr],
  t1.[id]
FROM
  t3
  INNER JOIN t1 ON (
        t1.[min] = t3.[min]
    AND t1.[max] = t3.[max]
    AND t1.[cnt] = t3.[cnt] )
;

...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти полное вхождение / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]