【问题标题】:SQL Query to get calendar week with highest number of matching idsSQL 查询以获取匹配 id 数量最多的日历周
【发布时间】:2019-06-26 10:04:26
【问题描述】:

我在表格中有这些数据

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);

我需要知道的是 id 最匹配的日历周。没有任何数据是事先知道的。也就是说,calendar_week 和 id 是随机的。所以在这种情况下,它将是 201106 和 201107,因为它们具有相同的 id 并且我们有两个日历周。任何想法,如何做到这一点?我的脑袋是空的。非常感谢。

编辑: 如果我这样描述它可能会更清楚: Calendar week 201106 has these ids: 635, 636, 642, 643 Calendar week 201107 has these ids: 635, 636, 642, 643

所以这两个日历周的 id 是相同的,我可以用这些 id 计算两周。所有其他日历周都不同,并且只计算一个。所以 201106 和 201107 是赢家,期望的输出是 201106、201107。

【问题讨论】:

  • 为什么不是 201902 和 201211 周的 4421?

标签: sql sql-server tsql


【解决方案1】:

如果我理解正确,这只是group byorder by

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

Here 是一个 dbfiddle。

如果在有平局时只想要一行,请删除with ties

【讨论】:

  • 这仅返回 1 行 201211,这是不正确的
  • @Ralf 打算返回 2 行 201106 和 201107,因为 ID 是相同的 635,636,642,643
【解决方案2】:

我用连接解决了它。不是很漂亮,但很管用。

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
);

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多