【发布时间】:2021-11-14 10:38:07
【问题描述】:
我在 Fiddle 中构建了这个示例表:https://www.db-fiddle.com/f/pu1PkjzKCM9VRciznkJc4L/7
我正在为帐号和序列号重新标记地区。您可以看到我尝试更改数据并添加具有正确区域的新列的表架构和查询。问题是我的结果,你会在最后看到。我想找到一种方法首先通过serial_number,我已经确定serial_numbers 是跟踪区域的最佳方法,然后在serial_numbers 为空时添加正确的区域名称时使用acct_num。
但是,虽然我的程序主要用于此目的。当有一个 acct_num 并且没有 serial_number 时,它不会只是抛出它找到的最后一个“正确”区域。我需要这个程序来做到这一点。我在想也许是一个嵌套的case语句?我已经尝试在先前存在的 CASE 和 PARTITION BY 语句中执行此操作,但我一直没有成功,它一直抛出语法错误。
我在想...(PARTITION BY WHEN serial_number='NULL' THEN acct_num ELSE serial_number),但这总是会引发错误。
感谢任何帮助!
SQL 架构
'''
CREATE TABLE t (
"row" INTEGER,
"acct_num" TEXT,
"serial_number" TEXT,
"site_address" TEXT,
"city" TEXT,
"territory_name" TEXT
);
INSERT INTO t
("row", "acct_num", "serial_number", "site_address", "city", "territory_name")
VALUES
('1', '049403', 'TH-530', '344 Clinton Str', 'Metropolis', 'Central'),
('2', '049403', 'TH-530', '344 Clinton Str', 'Metropolis', 'Central'),
('3', '049206', 'GO-650', '1007 Mountain Dr', 'Gotham City', 'Gotham City'),
('4', '049206', 'GO-650', '1007 Mountain Dr', 'Gotham City', 'Gotham City'),
('5', '049206', 'GO-650', 'NULL', 'NULL', 'N/A'),
('6', '049206', 'TJO-560', 'NULL', 'NULL', 'NULL'),
('7', '049291', 'SM-708', '1938 Sullivan Pl', 'Smallville', 'No Territory'),
('8', '049293', 'TH-533', '700 Hamilton Str', 'Central City', 'Central'),
('9', '049396', 'AL-670', '800 Ellsmore Way', 'Alberty Township', 'South'),
('10', '049396', 'KILO-680', '600 Nukem Drive', 'Duke City', 'Southeast'),
('11', '049396', 'JALO-605', '5806 London Way', 'Hampshire', 'Northeast'),
('12', '049396', 'NULL', 'NULL', 'NULL', 'No Territory');
'''
SQL查询
'''
select row,
acct_num,
serial_number,
site_address,
MAX(
CASE
WHEN territory_name <> 'N/A' AND territory_name <> 'No Territory'
THEN territory_name
WHEN serial_number = 'NULL'
THEN territory_name
END)
over (PARTITION BY serial_number) as imputed_place
from t
order by row
'''
SQL查询结果
| row | acct_num | serial_number | site_address | imputed_place
| ----|----------|----------------|-----------------|---------------
| 1 | 049403 | TH-530 | 344 Clinton Str | Central
| 2 | 049403 | TH-530 | 344 Clinton Str | Central
| 3 | 049206 | GO-650 | 1007 Mountain Dr| Gotham City
| 4 | 049206 | GO-650 | 1007 Mountain Dr| Gotham City
| 5 | 049206 | GO-650 | NULL | Gotham City
| 6 | 049206 | TJO-560 | NULL | NULL
| 7 | 049291 | SM-708 | 1938 Sullivan Pl| null
| 8 | 049293 | TH-533 | 700 Hamilton Str| Central
| 9 | 049396 | AL-670 | 800 Ellsmore Way| South
| 10 | 049396 | KILO-680 | 600 Nukem Drive | Southeast
| 11 | 049396 | JALO-605 | 5806 London Way | Northeast
| 12 | 049396 | NULL | NULL | No Territory <- should be Northeast!!!
'''
DB Fiddle – 由英国的 Status200 用 ♥ 制作。 使用条款 • 隐私/Cookie 政策 • Status200 Ltd © 2018
【问题讨论】:
-
感谢您创建示例数据并共享查询及其结果。但是你能分享一下想要的结果是什么而不是这些吗?
-
您好 Felipe,SQL 查询结果表中有一条注释说“没有领土
标签: sql snowflake-cloud-data-platform domo