[英]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.