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 创建列表并用它搜索不同的表的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中使用 python UDF 中的表

在 Amazon Redshift 中使用 Diststyle ALL 的表应该有多小?

REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?

限制 Amazon Redshift 中架构的大小

如何在 Redshift 过程中写入动态创建的表

如何将密码存储在 Redshift 的表中?