SQL-запрос для получения календарной недели с наибольшим количеством совпадающих идентификаторов - PullRequest
1 голос
/ 26 июня 2019

У меня есть эти данные в таблице

IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest;
SELECT calendar_week, id
INTO #tmpTest
FROM ( VALUES 
(201106, 635),
(201106, 636),
(201106, 642),
(201106, 643),
(201107, 635),
(201107, 636),
(201107, 642),
(201107, 643),
(201211, 635),
(201211, 636),
(201211, 642),
(201211, 643),
(201211, 4421),
(201901, 635),
(201901, 636),
(201901, 642),
(201902, 635),
(201902, 636),
(201902, 642),
(201902, 4421)) AS t_insert (calendar_week, id);

Что мне нужно знать, так это календарные недели с наиболее подходящими идентификаторами.Ни один из данных не известен заранее.То есть calendar_week и id являются случайными.Так что в этом случае это будут 201106 и 201107, потому что они имеют идентичные идентификаторы, и у нас есть две календарные недели.Есть идеи, как этого добиться?Моя голова пуста.Большое спасибо.

Редактировать: Может быть, будет понятнее, если я опишу это так: Calendar week 201106 has these ids: 635, 636, 642, 643 Calendar week 201107 has these ids: 635, 636, 642, 643

Итак, идентификаторы этих двух календарных недель идентичны, и я могу посчитать две недели с этими идентификаторами,Все остальные календарные недели отличаются и учитывают только одну.Таким образом, 201106 и 201107 являются победителями, и желаемый результат - 201106, 201107.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Я решил это с конкатенацией. Не так красиво, но это работает.

SELECT calendar_week
FROM
(
    SELECT calendar_week,
           (
               SELECT CONVERT(VARCHAR(11), a.id) + ',' AS [text()]
               FROM #tmpTest a
               WHERE a.calendar_week = b.calendar_week
               FOR XML PATH('')
           ) AS ids_concatenated
    FROM #tmpTest b
    GROUP BY calendar_week
) t
WHERE ids_concatenated =
(
    SELECT TOP 1
           ids_concatenated
    FROM
    (
        SELECT calendar_week,
               (
               SELECT CONVERT(VARCHAR(11), a.id) + ',' AS [text()]
                   FROM #tmpTest a
                   WHERE a.calendar_week = b.calendar_week
                   FOR XML PATH('')
               ) AS ids_concatenated
        FROM #tmpTest b
        GROUP BY calendar_week
    ) t
    GROUP BY ids_concatenated
    ORDER BY COUNT(*) DESC
);
0 голосов
/ 26 июня 2019

Если я правильно понимаю, это просто group by с order by:

select top (1) with ties calendar_week, count(*)
from tmpTest
group by calendar_week
order by count(*) desc;

Здесь - это дБ <> скрипка.

Если вам нужна только одна строка при наличии связей, удалите with ties.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...