Redshift 创建列表并用它搜索不同的表
Posted
技术标签:
【中文标题】Redshift 创建列表并用它搜索不同的表【英文标题】:Redshift create list and search different table with it 【发布时间】:2021-11-02 16:47:03 【问题描述】:我认为有几种方法可以解决这个问题,但我不知道该怎么做。 我有两个表,第一个有 ID 和数字。 ID 和数字可能会列出不止一次,因此我创建了一个结果表,其中列出了按 ID 分组的唯一数字。
我的第二个表再次包含带有 ID 和 Numbers 的行(1 亿行)。我需要在该表中搜索任何 ID,其编号不在结果表中的数字列表中。
redshift 是否可以根据 ID 匹配并且 Number 是否存在于表中的列表中进行查询?这一切都可以在内存/一个语句中完成吗?
DROP TABLE IF EXISTS `myTable`;
CREATE TABLE `myTable` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`ID` varchar(255),
`Numbers` mediumint default NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1;
INSERT INTO `myTable` (`ID`,`Numbers`)
VALUES
("CRQ44MPX1SZ",1890),
("UHO21QQY3TW",4370),
("JTQ62CBP6ER",1825),
("RFD95MLC2MI",5014),
("URZ04HGG2YQ",2859),
("CRQ44MPX1SZ",1891),
("UHO21QQY3TW",4371),
("JTQ62CBP6ER",1826),
("RFD95MLC2MI",5015),
("URZ04HGG2YQ",2860),
("CRQ44MPX1SZ",1892),
("UHO21QQY3TW",4372),
("JTQ62CBP6ER",1827),
("RFD95MLC2MI",5016),
("URZ04HGG2YQ",2861);
SELECT ID, listagg(distinct Numbers,',') as Number_List, count(Numbers) as Numbers_Count
FROM myTable
GROUP BY ID
AS result
DROP TABLE IF EXISTS `myTable2`;
CREATE TABLE `myTable2` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`ID` varchar(255),
`Numbers` mediumint default NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1;
INSERT INTO `myTable2` (`ID`,`Numbers`)
VALUES
("CRQ44MPX1SZ",1870),
("UHO21QQY3TW",4350),
("JTQ62CBP6ER",1825),
("RFD95MLC2MI",5014),
("URZ04HGG2YQ",2859),
("CRQ44MPX1SZ",1891),
("UHO21QQY3TW",4371),
("JTQ62CBP6ER",1826),
("RFD95MLC2MI",5015),
("URZ04HGG2YQ",2860),
("CRQ44MPX1SZ",1882),
("UHO21QQY3TW",4372),
("JTQ62CBP6ER",1827),
("RFD95MLC2MI",5016),
("URZ04HGG2YQ",2861);
伪代码
Select ID, listagg(distinct Numbers) as Violation
Where Numbers IN NOT IN result.Numbers_List
or possibly: WHERE Numbers NOT LIKE '%' || result.Numbers_List|| '%'
期望的输出
(“CRQ44MPX1SZ”, ”1870,1882”)
(“UHO21QQY3TW”, ”4350”)
编辑 走 JOIN 路线,我没有得到正确的结果......但我很确定我的 WHERE 实现是错误的。
SELECT mytable1.ID, listagg(distinct mytable2.Numbers, ',') as unauth_list, count(mytable2.Numbers) as unauth_count
FROM mytable1
LEFT JOIN mytable2 on mytable1.id = mytable2.id
WHERE (mytable1.id = mytable2.id)
AND (mytable1.Numbers <> mytable2.Numbers)
GROUP BY mytable1.id
预期输出:
(“CRQ44MPX1SZ”, ”1870,1882”, 2)
(“UHO21QQY3TW”, ”4350”, 1)
【问题讨论】:
【参考方案1】:将 ID 和 numbers 上的两个表左连接并检查(where 子句)以查看是否未找到匹配项。不需要 listagg() 和复杂的比较。还是我错过了部分问题?
【讨论】:
是的,我认为这也可以。我只是想着如何在 Python 中做到这一点。我在 JOIN 中遇到的问题是它没有返回预期的结果。所以我知道我执行错了。我会更新我的问题。 我用连接做了一个快速的 sqlfiddle。这有帮助吗? sqlfiddle.com/#!15/f1442/7以上是关于Redshift 创建列表并用它搜索不同的表的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon Redshift 中使用 Diststyle ALL 的表应该有多小?
REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?