Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL/Teradata:返回连续行中的值相同的记录_Sql_Grouping_Teradata - Fatal编程技术网

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我在这里没有真正的起点。我在网上对此进行了研究,相信这涉及到使用分区,但我自己还没有得到任何进展。