【问题标题】:Redshift create list and search different table with itRedshift 创建列表并用它搜索不同的表
【发布时间】: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)

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案1】:

    将 ID 和 numbers 上的两个表左连接并检查(where 子句)以查看是否未找到匹配项。不需要 listagg() 和复杂的比较。还是我错过了部分问题?

    【讨论】:

    • 是的,我认为这也可以。我只是想着如何在 Python 中做到这一点。我在 JOIN 中遇到的问题是它没有返回预期的结果。所以我知道我执行错了。我会更新我的问题。
    • 我用连接做了一个快速的 sqlfiddle。这有帮助吗? sqlfiddle.com/#!15/f1442/7
    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多