[英]Inserting data into a table with a case expression
在我收到的邮政编码文件中,应该为每个邮政编码提供DMA(直销区域)。 但是,DMA的某些值为“”。 为了解决此问题,我应该将最常见的DMA用于邮编所在的县,并将其放入邮编的DMA中。
目前,我已经弄清楚了如何确定每个县中DMA的最大出现次数。 例如,我知道在阿贝维尔县,最频繁的DMA出现了5次,而对于阿卡迪亚,则是10倍。 此数据存储在使用以下代码创建的临时表#Temp2中:
INSERT INTO #Temp
SELECT ROW_NUMBER() OVER(PARTITION BY County, DMA ORDER BY County DESC) AS Num, County, DMA
FROM [HPW Data].[dbo].[Zip_Codes_All]
WHERE DMA <> '<NULL>'
INSERT INTO #Temp2
SELECT DISTINCT MAX(Num), County
FROM #Temp
GROUP BY County
在将邮政编码表划分为包含County,DMA和Num的段(这是任何County,DMA组合的出现次数)后,我通过找到最大行数来实现这一点
之后,我编写了这段代码,试图将邮政编码表中的''值替换为该县最频繁的DMA
INSERT INTO [HPW Data].[dbo].[Zip_Codes_All]
SELECT Zip_Code, c.County,
CASE c.DMA
WHEN '<NULL>' THEN (SELECT d.DMA WHERE c.County = d.County)
ELSE c.DMA END AS DMA
FROM [HPW Data].[dbo].[Zip_Codes_All] AS c,
(SELECT a.County, DMA FROM #Temp AS a, #Temp2 AS b WHERE a.Num = b.Num AND a.County = b.County) AS d
我认为它不能按预期工作的部分原因是因为某些DMA作为县中最常出现的DMA并列(例如:Adair County的三个DMA出现了五次,而最多的DMA出现了五次)。
我对此进行了快速尝试,我认为您的问题的一部分是1990年代的JOIN
语法?
WITH ZipCodeDMAs AS (
SELECT
County,
DMA,
COUNT(*) AS freq
FROM
[HPW Data].dbo.Zip_Codes_All
WHERE
DMA != '<NULL>'
GROUP BY
County,
DMA),
MaxDMA AS (
SELECT
County,
DMA,
ROW_NUMBER() OVER (PARTITION BY County ORDER BY freq DESC) AS order_id
FROM
ZipCodeDMAs)
INSERT INTO
[HPW Data].dbo.Zip_Codes_All
SELECT
Zip_Code,
c.County,
ISNULL(c.DMA, m.DMA) AS DMA
FROM
[HPW Data].dbo.Zip_Codes_All c
INNER JOIN MaxDMA m ON m.County = c.County AND m.order_id = 1;
这使用两个CTE来:-获取County-DMA元组的频率; -确定每个县最频繁的DMA(允许联系-在“随机”中选择一个)。
这只是在我们的数据中没有一个的情况下,在最频繁的DMA中进行交换的情况。 这假定您的数据将永远不会有我们以前从未拥有过DMA的“新”县,否则INNER JOINs
将中断查询。
我并没有真正遵循您的示例,您似乎正在使用ROW_NUMBER()
提出一些次优的计数频率方法,然后在其余的代码中使用该方法。 SELECT * FROM a, b, c
大约在20年前就过时了!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.