我的代码有效,但我不知道为什么


SELECT *
FROM (
        SELECT TOP 100
        o.[Incident ID], 
        o.[Affected CI], 
        o.Title, 
        o.[Description], 
        d.[DB NAME],
        ROW_NUMBER() OVER(PARTITION BY o.[Incident ID] ORDER BY o.[Incident ID]) rn
        FROM Oracle_Incident_Data.dbo.Oracle_Incidents AS O 
        LEFT JOIN Oracle_Incident_Data.dbo.DB_NAMES_ORA$ AS D 
        ON CONCAT(COALESCE(o.[Affected CI],' '), COALESCE(o.[Title],' '), COALESCE(o.[Description],' ')) LIKE '%' + d.[DB NAME] + '%'
    ) a
WHERE rn = 1

一位朋友向我推荐了分区,以解决我在上一个查询返回匹配项时遇到的问题,在 DB Name 中找不到匹配项并移动到下一个事件。 问题是现在我真的不明白它在做什么,我想调整匹配。 接下来,我想弄清楚如何使其连接最长的匹配字符串,但我需要首先了解分区在此查询中的工作原理。 提前谢谢你。

窗口函数起初令人困惑。毫无疑问。

ROW_NUMBER() OVER(PARTITION BY o.[Incident ID] ORDER BY o.[Incident ID]) rn

该行将创建一个从 1 开始并为每个记录递增的row_number。对于查询结果集中遇到的每个新o.[Incident ID],它将在 1 点重新开始。它还确定按o.[Incident ID]编号的顺序。

例如:

 rn   IncidentID
 1       A
 2       A
 3       A
 1       B
 2       B
 1       C
 2       C
 3       C

要查看它在做什么,请将子查询取出并自行运行,按o.[Incident ID]对查询结果进行排序。到时候就清楚了。

然后,使用 WHERE rn = 1 的主查询仅筛选出1 ROW_NUMBER的记录。

话虽如此,我认为它的写作方式不正确。 PARTITION BYORDER BY真的不应该是一样的。当您的记录集中有多个记录具有相同的o.[Incident ID]时,它会导致 arbritrary 编号。每次运行查询时,这些结果可能会更改,具体取决于数据库从基础表中获取数据的方式。

相反,您可能应该ORDER BY一些东西,当您按o.[Incident ID]分区时,实际上会产生一个 ORDER。通常,这是一个 DATE 或某个度量字段,但它也可能是任意的,例如您的标题或描述。

相关内容

最新更新