我的代码有效,但我不知道为什么
My code works but I don't know why
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
一位朋友向我推荐了分区,以解决我遇到的问题,即之前的查询返回了所有匹配项,但未在数据库名称中找到匹配项并转到下一个事件。现在的问题是我真的不明白它在做什么,我想调整匹配。接下来我想弄清楚如何让它加入最长的匹配字符串,但我需要先了解分区在这个查询中是如何工作的。提前谢谢你。
窗口函数起初令人困惑。毫无疑问。
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
的主查询然后仅过滤掉 ROW_NUMBER
为 1
的记录。
尽管如此,我认为它的编写方式并不正确。 PARTITION BY
和 ORDER BY
确实不应该相同。当你的记录集中有多个具有相同 o.[Incident ID]
的记录时,它会导致任意编号。每次您 运行 查询时,这些结果可能会发生变化,具体取决于您的数据库如何从基础表中获取数据。
相反,您可能应该 ORDER BY
当您按 o.[Incident ID]
分区时实际上会产生一个 ORDER 的东西。通常这是一个 DATE 或一些度量字段,但它也可以是任意的,例如您的标题或描述。
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
一位朋友向我推荐了分区,以解决我遇到的问题,即之前的查询返回了所有匹配项,但未在数据库名称中找到匹配项并转到下一个事件。现在的问题是我真的不明白它在做什么,我想调整匹配。接下来我想弄清楚如何让它加入最长的匹配字符串,但我需要先了解分区在这个查询中是如何工作的。提前谢谢你。
窗口函数起初令人困惑。毫无疑问。
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
的主查询然后仅过滤掉 ROW_NUMBER
为 1
的记录。
尽管如此,我认为它的编写方式并不正确。 PARTITION BY
和 ORDER BY
确实不应该相同。当你的记录集中有多个具有相同 o.[Incident ID]
的记录时,它会导致任意编号。每次您 运行 查询时,这些结果可能会发生变化,具体取决于您的数据库如何从基础表中获取数据。
相反,您可能应该 ORDER BY
当您按 o.[Incident ID]
分区时实际上会产生一个 ORDER 的东西。通常这是一个 DATE 或一些度量字段,但它也可以是任意的,例如您的标题或描述。