2013-12-12 4 views
2

У меня есть таблица, как показано нижеКак найти соседние значения в колонке на основе другого значения столбца в Sql

enter image description here

Из приведенных выше таблиц нужно выбрать смежные значения из столбца val3 на основе столбца Номера

мне нужен выход, как показано ниже:

enter image description here

+0

Почему бы не 6024: 11,12? –

+0

@OcasoProtal Извините, 6024: 11,12 тоже .... Отредактировал вопрос – Roshan

+0

Почему не только 1 ряд с 6015,1,2,9 – DevelopmentIsMyPassion

ответ

2
WITH T1 
    AS (SELECT *, 
       DENSE_RANK() OVER (PARTITION BY [Number] ORDER BY [Val3]) - [Val3] AS Grp 
     FROM YourTable), 
    T2 
    AS (SELECT *, 
       COUNT(*) OVER (PARTITION BY [Number], Grp) AS Cnt 
     FROM T1) 
SELECT [Number], 
     [Val1], 
     [Val2], 
     [Val3] 
FROM T2 
WHERE Cnt > 1 
+0

Большое спасибо за вашу быструю помощь. – Roshan

2

уродливые решение будет:

select d.number, d.val1, d.val2, d.val3 from table d 
where exists 
(select * from table t 
     where t.number = d.number 
      --and t.val1 = d.val1 
      --and t.val2 = d.val2 
      and (t.val3 = d.val3 - 1 or t.val3 = d.val3 + 1)) 
+0

Большое спасибо wxyz – Roshan

2

Вы можете определить последовательный набор цифр тем, что число - его позиция в наборе будет постоянным, например,

Val3 | RowNumber | Val - RowNumber 
4 | 1  | 3 
5 | 2  | 3 
6 | 3  | 3 
8 | 4  | 4 
9 | 5  | 4 

Как вы можете видеть Val - RowNumber столбец остается постоянной для каждого последовательного набора. Таким образом, чтобы применить это к вашему запросу:

WITH GroupedT AS 
( SELECT Number, 
      Val1, 
      Val2, 
      Val3, 
      GroupingSet = Val3 - DENSE_RANK() OVER(PARTITION BY Number, Val1, Val2 ORDER BY Val3) 
    FROM T 
), SequentialT AS 
( SELECT Number, 
      Val1, 
      Val2, 
      Val3, 
      SequenceCount = COUNT(*) OVER(PARTITION BY Number, Val1, Val2, GroupingSet) 
    FROM GroupedT 
) 
SELECT Number, Val1, Val2, val3 
FROM SequentialT 
WHERE SequenceCount > 1 
ORDER BY Number, Val1, Val2, Val3; 

Example on SQL Fiddle

+0

+1 для объяснения и скрипки. –

0

Похоже, что вы пытаетесь сделать, это устранить любые записи, которые содержат значение val3, что не имеет значения смежных val3 в других записях. Для этого я думаю, вы можете использовать что-то вроде этого:

SELECT t1.* 
FROM myTable t1 
JOIN myTable t2 ON t1.Number = t2.Number 
AND t1.Val1 = t2.Val1 
AND t1.Val2 = t2.Val2 
AND (t2.Val3 IN (t1.Val3 - 1, t1.Val3 + 1)) 
+2

Вам нужно добавить 'DISTINCT', иначе вы получите 6020: 5 дважды! –

Смежные вопросы