我刚开始使用Teradata,说实话一直很有趣。然而,我遇到了困扰我一段时间的路障。
我从数据库中成功选择了一个表格,如下所示:
ID service date name
1 service1 1/5/15 john
2 service2 1/7/15 steve
3 service3 1/8/15 lola
4 service4 1/3/15 joan
5 service5 1/5/15 fred
6 service3 1/3/15 joan
7 service5 1/8/15 oscar
现在我想再次搜索数据库以找到任何重复的ID(例如:查看具有名称john的日期为1/5/15的服务service1是否存在于具有不同ID的另一行上。)
起初,我做了类似的事情:
SELECT ID, service, date, name
FROM table
WHERE table.service = ANY(service1, service2, service3, service4, service5, service3, service5)
AND table.date = ANY('1/5/15', '1/7/15, '1/8/15', '1/3/15', '1/5/15', '1/3/15', '1/8/15')
AND table.name = ANY('john', 'steve', 'lola', 'joan', 'fred', 'joan', 'oscar');
但是这给了我比我想要的更多的行。
示例:
ID service date name
92 service3 1/8/15 steve
对我没用,因为我正在寻找与上表中任何其他ID具有相同服务,日期和名称组合的ID。
这样的事情会很有利:
ID service date name
609 service3 1/8/15 lola
因为它匹配ID 3。
我很想知道是否可以将三列(服务,日期,名称)视为一个向量,并且可能选择与之匹配的行?
离
......
WHERE (table.service, table.date, table.name) = ANY((service3,1/8/15,lola), (service1, 1/5/15, john), ...etc)
我的Teradata现在已经关闭,所以我还没有尝试上面的例子。不过,非常感谢任何想法/反馈!
答案 0 :(得分:1)
对于窗口聚合来说,这是一项简单的任务:
SELECT *
FROM tab
QUALIFY
COUNT(*) OVER (PARTITION BY service, date, name) > 1
这会计算具有相同值组合的行数(如Tim Biegeleisen的派生表),但与标准聚合不同,它会保留所有行。 QUALIFY
是一个很好的Teradata语法扩展,可以避免派生表。
答案 1 :(得分:0)
以下查询可能是您要实现的目标。这会选择name
,SELECT t1.ID
FROM yourTable t1
INNER JOIN
(
SELECT service, date, name
FROM yourTable
GROUP BY service, date, name
HAVING COUNT(*) > 1
) t2
ON t1.service = t2.service AND
t1.date = t2.date AND
t1.name = t2.name
和// this would work, but I'd prefer to avoid parsing something I
// happen to already know contains valid json
val rawJsonStr = "..."
val spliced = JField("foo", parse(rawJsonStr))
的组合出现多次的ID。
{{1}}
答案 2 :(得分:0)
SELECT dupes.*
FROM (your query) yourquery
JOIN table dupes
ON yourquery.service = dupes.service
AND yourquery.date = dupes.date
AND yourquery.name = dupes.name