2015-11-23 3 views
0

У меня 3 колонки в моем столе: col1, col2 и col3.Как решить ниже логику, используя сервер sql?

col2 is having (1,  0, 2, 3, 4, 0, 1, 3) 
col3 is having (1234,1023,1025,1032,1234,1013,1325,1332) 

Я должен получить col1 значения, как

(1234,1234,1234,1234,1234,1013,1013,1013) 

Логика здесь я должен получить col3 значение для col1 до тех пор, пока такое же число повторяется в колонке два.

Пожалуйста, дайте мне какое-либо предложение, чтобы решить эту проблему.

+2

логики вы дали, чтобы получить 'col1' значения не делают чувство. Пожалуйста, объясните в еще большем, почему значение в 'col1' составляет' 1234' для первых 5 строк. – Utsav

+3

Но строки в таблице неупорядочены. Вам нужен какой-то последовательный столбец. – jarlh

+0

atleast show output желание. «Мне нужно получить значение col3 для col1, пока в столбце не будет повторено то же число». это не понятно. объясните. – KumarHarsh

ответ

0

Я подозреваю, что col2 имеет количество, а col3 имеет значения, хотя ваши данные на выбору действительно не делают этого ясно. Один из способов сделать то, что вы хотите, чтобы использовать таблицу чисел, так вот метод:

with numbers as (
     select row_number() over (order by (select null)) as n 
     from masterl.spt_values 
    ) 
select t.col2 
from t join 
    numbers n 
    on t.col3 <= n.n; 

Если вы предпочитаете решение, которое не зависит от недокументированной системы таблицы:

with numbers as (
     select 1 as n, max(col2) as maxn 
     from t 
     union all 
     select n + 1, maxn 
     from numbers 
     where n < max 
    ) 
select t.col2 
from t join 
    numbers n 
    on t.col3 <= n.n 
option (MAXRECURSION 0); 
0

Я бы рекомендовал добавить в IDENTITY столбец в таблицу, вы можете сделать это, как показано ниже:

ALTER TABLE t 
ADD ColID int IDENTITY(1,1) 

или путем создания новой таблицы, чтобы обеспечить порядок данные корректны:

CREATE TABLE t (ColID int IDENTITY(1,1), Col1 int, Col2 int, Col3 int) 

Чтобы ответить на этот вопрос, мне нужно использовать таблицу со столбцом идентификации, поэтому сначала вставить данные ..

INSERT t (Col2, Col3) 
VALUES (1,1234), 
    (0,1023), 
    (2,1025), 
    (3,1032), 
    (4,1234), 
    (0,1013), 
    (1,1325), 
    (3,1332), 
    (5,1523), 
    (4,1234) 

Затем, используя выражение общего таблицы cte вы можете производить результаты для первой колонки что только изменить на новое значение столбца три, если значение в колонке два содержатся в приведенных выше данных, когда заказанный столбец идентификации:

;WITH cte as (
    SELECT ColID, 
     row_number() over (partition by Col2 order by ColID) count2, 
     col2, 
     col3 
    FROM t 
    ) 

SELECT t1.ColID, t2.Col3 Col1, t1.Col2, t1.Col3 
FROM (
    SELECT c1.ColID, 
     c1.Col2, 
     c1.Col3, 
     MAX(c2.ColID) ValColID 
    FROM cte c1 
    LEFT JOIN cte c2 ON c2.ColID <= c1.ColID AND (c2.count2 > 1 OR c2.ColID = 1) 
    GROUP BY c1.ColID,c1.Col2,c1.Col3 
    ) t1 
INNER JOIN cte t2 ON t1.ValColID = t2.ColID 
Смежные вопросы