SQL/Teradata:返回连续行中的值相同的记录
我有一个数据集,看起来像:SQL/Teradata:返回连续行中的值相同的记录,sql,grouping,teradata,Sql,Grouping,Teradata,我有一个数据集,看起来像: ID date emp_num loc 1111 5/2/16 111111 Brooklyn 1112 5/3/16 222222 Detroit 1113 5/3/16 333333 San Diego 1114 5/2/16 333333 Orlando 1115 5/5/16 333333 Brooklyn 1116
ID date emp_num loc
1111 5/2/16 111111 Brooklyn
1112 5/3/16 222222 Detroit
1113 5/3/16 333333 San Diego
1114 5/2/16 333333 Orlando
1115 5/5/16 333333 Brooklyn
1116 5/7/16 111111 Orlando
在本例中,我希望返回记录1113、1114和1115,因为连续行中的emp_num(按ID排序)是相同的
我使用Teradata,但如果有人有另一个引擎的SQL解决方案,我通常可以设法翻译它
谢谢。首先,获取按id列排序、按emp_num分区和按id列排序的行数差。这将把emp_num分为几个组。然后,获取包含多个成员的组(这意味着存在具有相同emp_num值的连续行)。最后,为这些组选择所需的列
WITH x AS (SELECT
*,
ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY emp_num ORDER BY id) grp
FROM t),
grpsneeded
AS (SELECT
grp
FROM x
GROUP BY grp
HAVING COUNT(*) > 1)
SELECT
id,
dt,
emp_num
FROM x
WHERE grp IN (SELECT
grp
FROM grpsneeded)
此解决方案与SQL Server配合使用效果良好
更简单的SQL解决方案是使用lead
和lag
函数。正如@dnoeth所指出的,Teradata不支持这些函数。但是,这可能对其他数据库引擎有用
select id, dt , emp_num from (
select *
,lead(emp_num) over(order by id) nxt
,lag(emp_num) over(order by id) prev
from t
) x
where coalesce(nxt,0) = emp_num or coalesce(prev,0) = emp_num
您需要查看上一行/下一行,并检查它是否没有更改:
SELECT *
FROM tab
QUALIFY
MIN(emp_num) --previous row
OVER (ORDER BY ID
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) = emp_num
OR
MIN(emp_num) -- next row
OVER (ORDER BY ID
ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) = emp_num
在标准SQL中,这将是
LAG
/LEAD
的一项任务,但Teradata不执行它,因此您必须重写它 你能把你解决这个问题的尝试也贴出来吗?我认为你的第二个问题应该是一个单独的问题post@vkp这看起来像是一个缺口和孤岛问题,可能他不知道从哪里开始。@Theonendonlychemistryblob我删除了第二个问题,因为第一个问题已经足够开始了。@vkp我在这里没有真正的起点。我在网上对此进行了研究,相信这涉及到使用分区,但我自己还没有得到任何进展。