2017-01-06 3 views
-1

У меня есть DB таблица выглядит следующим образомКак получить желаемый результат с помощью SQL

IDCol Col1 Col2 Col3 
ID1  1  3  1000 
ID1  6  6  1000 
ID2  3  4  500 
ID2  1  7  500 

Мне нужен выход, как и следующий

IDCol Col1 Col2 Col3 
ID1  1  6  1000 
ID2  3  7  500 

Есть ли вероятность того, что я мог бы получить Вышеуказанный формат вывода с использованием SQL? Я новичок в SQL, и кто-нибудь может мне помочь? Большое спасибо!

+0

Что вы стремитесь получить? Я не вижу логики возврата данных в запрошенном формате. –

+0

похоже, что вам нужна группа. IDCOL –

+0

Объясните логику – Mihai

ответ

2

на основе данных выборки, я считаю, что это то, что вы ищете:

SELECT IDCol 
    , MIN(Col1) AS [Col1] 
    , MAX(Col2) AS [Col2] 
    , Col3 
FROM Table 
GROUP BY IDCol 
    , Col3 

Основываясь на информации из ваших комментариев, если добавить столбец с номером строки, то одна из решений будет быть в форме:

select t1.idcol 
    , t1.col1 
    , t2.col2 
    , t1.col3 
from 
(select idcol 
    , min(rn) over (partition by idcol) first_val 
    , max(rn) over (partition by idcol) last_val 
from table 
group by idcol, rn) r 
    inner join table t1 on r.first_val = t1.rn 
     and r.idcol = t1.idcol 
    inner join table t2 on r.last_val = t2.rn 
     and r.idcol = t2.idcol 
group by t1.idcol 
    , t1.col1 
    , t2.col2 
    , t1.col3 

Пример кода работает на основе ваших данных выборки:

declare @tbl table (rn int identity(1,1), idcol varchar(4), col1 int, col2 int, col3 int) 
insert @tbl values ('id1', 1, 3, 1000) 
    , ('id1', 6, 6, 1000) 
    , ('id2', 3, 4, 500) 
    , ('id2', 1, 7, 500); 


select t1.idcol 
    , t1.col1 
    , t2.col2 
    , t1.col3 
from 
(select idcol 
    , min(rn) over (partition by idcol) first_val 
    , max(rn) over (partition by idcol) last_val 
from @tbl 
group by idcol, rn) r 
    inner join @tbl t1 on r.first_val = t1.rn 
     and r.idcol = t1.idcol 
    inner join @tbl t2 on r.last_val = t2.rn 
     and r.idcol = t2.idcol 
group by t1.idcol 
    , t1.col1 
    , t2.col2 
    , t1.col3 
+0

@pree Добро пожаловать в SO .. Однако добрые народы пытаются лучше ответить на ваш вопрос .. Всегда будет здорово, если вы сможете разоблачить, мотивировать желаемое решение. – cvsingh

+0

Благодарим вас за ответ. К сожалению, я не указывал, что Col1 и Col2 не всегда связаны с min или max. Например, вторая строка для ID1 может быть ID1, 6, 4. Таким образом, это решение не будет работать, правильно? – Pree

+0

@Pree Вам нужно предоставить дополнительную информацию о том, как вы выбираете эти строки или значения. –

-1

I т hink вы должны указать уровень абстракции для этой задачи. Вы можете достичь этого результата, используя множество операторов. Вопросы - это то, что представляют собой строки данных и почему требуется ожидаемый вывод.

+0

может у вас показать мне, как получить желаемый результат? – Pree

+0

К этому сообщению я имел в виду, что вы можете предоставить множество (даже почти жестко запрограммированных) формул для предоставления этого вывода (например, выбор по значению или что-то еще). Таким образом, каждый ответ ошибочен дизайном, потому что мы не знаем намерений автора. Когда я опубликовал комментарий, только форма uotput была предоставлена ​​без полезной информации. – NealSinclair

1

Другой способ попытки его использования LEAD (поддерживается с 2012 года):

declare @t1 table 
(
IDCol char(5), 
Col1 INT, 
Col2 INT, 
Col3 INT 
) 

Insert into @t1 values ('ID1',  3 ,  3 ,  1000); 
Insert into @t1 values ('ID1',  6 ,  6 ,  1000); 
Insert into @t1 values ('ID1',  6 ,  4 ,  1000); 
Insert into @t1 values ('ID2',  11 ,  3 ,  1000); 
Insert into @t1 values ('ID2',  6 ,  6 ,  1000); 

Select * from 
(
    Select t1.IDCol, t1.Col1, 
    Lead(t1.Col2) Over (Partition by t1.IDCol Order By t1.IDCol) Col2, 
    t1.Col3 From 
    (
     Select IDCol, Col1, Col2, Col3, 
     ROW_NUMBER() over(partition by IDCol order by IDCol) as RowFlg 
     from @t1 
    ) t1, 
    (
     Select IDCol, Min(RowFlg) Col1MinVal, Max(RowFlg) Col2MaxVal from 
     (
      Select IDCol, ROW_NUMBER() over(partition by IDCol order by IDCol) as RowFlg from @t1 
     ) z 
     Group By IDCol 
    ) x 
    Where t1.IDCol = x.IDCol AND (t1.RowFlg = x.Col1MinVal OR t1.RowFlg = x.Col2MaxVal) 
) main 
Where Col2 is not null 
Смежные вопросы