2013-06-14 2 views
0

Вот выборка данных:SQL. Сравнение строк и заданных значений NULL If несуществующих

| date | id | version | 
| 2013-04-15 | 'ape' | 1.1 | 
| 2013-04-15 | 'bat' | 2.1 | 
| 2013-04-15 | 'cat' | 3.1 | 
| 2013-04-15 | 'dog' | 4.1 | 
| 2013-03-15 | 'ape' | 1.0 | 
| 2013-03-15 | 'cat' | 3.2 | 
| 2013-03-15 | 'dog' | 3.8 | 
| 2013-02-15 | 'ape' | 0.9 | 
| 2013-02-15 | 'dog' | 3.1 | 

Запрос будет определить новейшую дату и вторую новейшую дату. В примере это 2013-4-15 и 2013-3-15.

я, вероятно, найти тех, кто с этим кодом, потому что это то, что я знаю:

DECLARE @FirstDate DATETIME 
SET @FirstDate = (SELECT max(date) 
       FROM mytable) 

DECLARE @SecondDate DATETIME 
SET @SecondDate = (SELECT max(date) 
       FROM mytable 
       WHERE date < @FirstDate) 

Я хочу вывода, как это:

| date  | id | version | prevdate | pversion | 
| 2013-04-15 | 'ape' | 1.1  | 2013-03-15 | 1.0  | 
| 2013-04-15 | 'bat' | 2.1  | 2013-03-15 | null  | 
| 2013-04-15 | 'cat' | 3.1  | 2013-03-15 | 3.2  | 
| 2013-04-15 | 'dog' | 4.1  | 2013-03-15 | 3.8  | 

Таким образом, запрос находит все строки с датой = Первое свидание. И для каждой строки он будет смотреть строки date = SecondDate и включать номер версии для строк с одним и тем же идентификатором. Если нет даты = строка SecondDate с тем же идентификатором, верните «null» или «» или 0 или что-то еще.

+0

У вас есть столбец с таким порядком ваших строк ?. Таблица не имеет «естественного» порядка, поэтому, говоря, что вам нужен тот же порядок, что и на исходной таблице, бессмысленно – Lamak

+0

Хорошо, я отредактировал его. – user1744318

ответ

0

Хорошо, вот один из способов:

SELECT A.*, B.[date] prevdate, B.[Version] pVersion 
FROM myTable A 
OUTER APPLY (SELECT TOP 1 [date], [Version] 
      FROM myTable 
      WHERE [date] < A.[date] 
      AND id = A.id) B 
WHERE A.[date] = (SELECT MAX([date]) FROM myTable) 

Это результаты:

╔════════════╦═════╦═════════╦════════════╦══════════╗ 
║ date ║ id ║ Version ║ prevdate ║ pVersion ║ 
╠════════════╬═════╬═════════╬════════════╬══════════╣ 
║ 2013-04-15 ║ ape ║ 1,1  ║ 2013-03-15 ║ 1  ║ 
║ 2013-04-15 ║ bat ║ 2,1  ║ NULL  ║ NULL  ║ 
║ 2013-04-15 ║ cat ║ 3,1  ║ 2013-03-15 ║ 3,2  ║ 
║ 2013-04-15 ║ dog ║ 4,1  ║ 2013-03-15 ║ 3,8  ║ 
╚════════════╩═════╩═════════╩════════════╩══════════╝ 

И here is an sqlfiddle с демонстрационной этого.

+0

Кажется достаточно простым! Благодарю. – user1744318

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