2015-02-11 5 views
0

Пожалуйста, смотрите DDL ниже:Использование SQL или TSQL

CREATE TABLE Groups 
(
    GroupID integer not null, 
    Dataset int, 
    URN int, 
    DateAdded datetime 
) 

INSERT INTO Groups(1,1,100,'2010-01-01') 
INSERT INTO Groups(1,1,191,'2011-01-01') 
INSERT INTO Groups(1,1,65,'2012-01-01') 
INSERT INTO Groups(1,2,121,'2013-01-01') 

INSERT INTO Groups(2,1,87,'2010-01-01') 
INSERT INTO Groups(2,1,1081,'2011-01-01') 
INSERT INTO Groups(2,1,32,'2012-01-01') 
INSERT INTO Groups(2,1,16,'2013-01-01') 
INSERT INTO Groups(2,2,66,'2013-01-01') 

Я пытаюсь вернуть таблицу, как это:

100 191 
100 65 
87 1081 
87 32 
87 16 

Колонка 1 является идентификатор группы и столбец 2 является URN. Список соответствует критериям:

  1. Получить все записи с набором данных 1 из группы

  2. Всегда отображать самую старую URN (с использованием dateadded) в столбце 1 (где набор данных = 1). В колонке 2 поставить другую URN из группы (где набор данных = 1)

  3. Убедитесь, что все урн (ГДЕ набор данных = 1) из группы появляются один раз в колонке 2 для URN, который отображается в столбце, за исключением 1

Я считаю, что мне нужно делать это программно (используя TSQL), однако я задавался вопросом, есть ли способ сделать это с помощью SQL.

+0

Ваши результаты не соответствуют вашим заявленным требованиям. Исходя из ваших требований, вы должны вернуть только 2 записи (по одной для каждой группы). –

+0

@D Stanley, я отредактировал требования, чтобы попытаться сделать его более ясным. – w0051977

+0

Он по-прежнему не соответствует. Самый старый URN для группы 1 будет 100, а старшим из группы 2 будет 78. Вы показываете все записи _except_ самый старый. –

ответ

1

Вы можете использовать FIRST_VALUE, чтобы получить самую старую URN для каждой группы:

SELECT FIRST_VALUE(URN) OVER (PARTITION BY GroupID ORDER BY DateAdded) AS OldestURN, URN 
FROM Groups 
WHERE Dataset = 1 

Выход:

OldestURN URN 
--------------- 
100   100 
100   191 
100   65 
87   87 
87   1081 
87   32 
87   16 

Тогда просто гнездо выше запрос внутри другого, чтобы получить только записи с OldestURN <> URN:

SELECT OldestURN, URN 
FROM (
    SELECT FIRST_VALUE(URN) OVER (PARTITION BY GroupID ORDER BY DateAdded) AS OldestURN, 
      URN 
    FROM Groups 
    WHERE Dataset = 1) t 
WHERE OldestURN <> URN 

Выход:

OldestURN URN 
--------------- 
100   191 
100   65 
87   1081 
87   32 
87   16 
+0

Спасибо. Я думаю, что это может сделать это. +1. Я буду тестировать завтра и отчитываться. – w0051977

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