2016-11-16 141 views
1

我有一个包含下面的结构数据的表:SQL选择条件

Id | OperationType | ObjectName | dt_created 
-- | ------------- | ---------- | ---------- 
1 | 4    | test.com | 2015-08-30 23:23:57.000 
2 | 7    | test.com | 2015-08-30 23:23:57.000 
3 | 17   | test.com | 2015-08-30 23:23:57.000 
4 | 26   | test.com | 2015-08-30 23:23:57.000 
5 | 8    | test.com | 2015-08-30 23:23:57.000 
6 | 4    | test.com | 2015-08-30 23:23:57.000 
7 | 17   | 123.com | 2015-08-30 23:23:57.000 
8 | 18   | 123.com | 2015-08-30 23:23:57.000 
9 | 26   | 123.com | 2015-08-30 23:23:57.000 
10 | 8    | 123.com | 2015-08-30 23:23:57.000 

我想记录的ID的地方有一个操作型其次

我试图像几个方法:

 
select abc.id, abc.PreviousOperationType 
from (select id, 
     case 
      when OperationType = 26 
      then 
       lead(OperationType, 1, 0) over (partition by id order by id) 
      else 
       null 
      end as PreviousOperationType 
from operation 
where dt_created between '2015-09-20' and '2015-09-30') as abc 
where abc.PreviousOperationType is not null and abc.PreviousOperationType= 17 

,但没能得到准确的结果。

任何帮助,将不胜感激。

感谢, Ĵ

+1

显示我们预期的结果也是如此。 – jarlh

+1

你正在使用哪个sql server – mansi

+1

你想要Id 3或4的结果? –

回答

1

下面的查询给出了你ID 3,因为它是类型17的,随后是类型26

select id 
from 
(
    select 
    id, 
    operationtype, 
    lead(operationtype) over (order by dt_created) as next_operationtype 
    from operation 
) op 
where operationtype = 17 and next_operationtype = 26; 
+1

补充一下,sagi击败了我;-) –

+0

想通了:我不得不在由dt_created排序的同时通过ObjectName使用分区。 – Jinish

3

你接近:

select abc.id, abc.PreviousOperationType 
from (select id, 
      OperationType, 
      lead(OperationType, 1, 0) over (order by id) NextOperationType 
     from operation 
     where dt_created between '2015-09-20' and '2015-09-30') abc 
where abc.OperationType = 17 AND 
     abc.NextOperationType= 26 

无需通过子句中使用该分区的LEAD()功能里面,因为每个ID都是唯一的。

1

只是使用ROW_NUMBER()功能,而不铅()函数,因此,兼容的记录与SQL Server 2008和2005年太:)

;WITH X AS (
Select * 
     ,ROW_NUMBER() OVER (ORDER BY ID) rn 
from TableName) 
SELECT x.* 
FROM X x 
INNER JOIN X y ON x.rn + 1 = y.rn 
       AND x.OperationType = 17 
       AND y.OperationType = 26 
+0

非常感谢,所有的评论帮助。至少我能够发现我对这个问题的理解存在差距。我需要抓取记录,其中17紧接在对象名称周围,因此对于每个ObjectName。我更新了表格结构。所以,只有在表格数据看起来像帖子中的数据时,我才需要记录3和4。谢谢 – Jinish