Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск строки слева от даты  [new]
Nigg
Member

Откуда:
Сообщений: 29
Столкнулся с проблемой есть таблица, где поле OnDate дата с которой действует то или иное значение, если пустая то это что-то вроде начального значения, когда не было других, то есть оно самое первое.
Есть переменная @Date

Задача найти ближайшее слева значение (Value) для каждой группы ID

Table 1 (ID,Value,OnDate)

1 100
1 300 01.01.2013
1 150 13.02.2014
2 600
2 500 03.04.2012


Для одного объекта я могу это сделать
select top 1 t1.Value
from Table 1 t1
where OnDate <= @Date

Подскажите как сделать тоже самое для группы? Или может быть есть другие способы?

Пробовал инсертить выборку через Rank() (Partition by ID order by OnDate desc) во временную таблицу
и оттуда делать select *
where Rank = 1

В принципе работает, но может быть есть более оптимальный вариант?
13 фев 14, 12:42    [15562159]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
select *
from Table 1 t1
where OnDate is null
13 фев 14, 12:45    [15562176]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Nigg
Member

Откуда:
Сообщений: 29
Glory, значение OnDate не Null, а пустышка ('')
Но это не важно ваш запрос не вернет нужного результата. Нужна именно 1 строка по каждому объекту где OnDate меньше либо равно параметру @Date
13 фев 14, 12:50    [15562203]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nigg
Glory, значение OnDate не Null, а пустышка ('')

Значение типа date(time) не может быть "пустышкой"
13 фев 14, 12:51    [15562212]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Записи, ближайшие от @Date?
Это такие, для которых модуль разницы в днях с @Date минимальна?
SELECT TOP(1)WITH TIES *
FROM Table1
ORDER BY RANK()OVER(PARTITION BY ID ORDER BY ABS(DATEDIFF(DAY,@Date,ISNULL(OnDate,0))));
???

НЕ ПРОВЕРЯЛ!
13 фев 14, 12:54    [15562254]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Nigg
Member

Откуда:
Сообщений: 29
Glory,

Да, вы правы тип данных smalldatetime, в случае если дата не заполнена стоит 19000101.

Iap, предложенный вариант по-моему не будет работать для группы объектов.
13 фев 14, 12:56    [15562267]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
Записи, ближайшие от @Date?
Это такие, для которых модуль разницы в днях с @Date минимальна?
SELECT TOP(1)WITH TIES *
FROM Table1
ORDER BY RANK()OVER(PARTITION BY ID ORDER BY ABS(DATEDIFF(DAY,@Date,ISNULL(OnDate,0))));

???

НЕ ПРОВЕРЯЛ!
Извините, не обратил внимание на слово "СЛЕВА".
Очень странно его воспринимать по отношению к дате!
SELECT TOP(1)WITH TIES *
FROM Table1
WHERE OnDate<=@Date
ORDER BY RANK()OVER(PARTITION BY ID ORDER BY DATEDIFF(DAY,OnDate,@Date));
13 фев 14, 12:59    [15562283]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Добрый Э - Эх
Guest
Nigg,

Классический баян...
Доп условие на "меньше заданной даты" легко встраивается. Думаю - сам допетришь как это сделать
13 фев 14, 12:59    [15562293]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Nigg
Glory,

Да, вы правы тип данных smalldatetime, в случае если дата не заполнена стоит 19000101.

Iap, предложенный вариант по-моему не будет работать для группы объектов.
Это аргумент!

Другое дело, ROW_NUMBER() или RANK()?
Если несколько одинаковых ближайших дат, то выдавать их все или только одну?
В последнем случае вопрос: а какую именно?
13 фев 14, 13:01    [15562308]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Nigg
Member

Откуда:
Сообщений: 29
iap, даты не пересекаются, то есть уникальны.
13 фев 14, 13:04    [15562327]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Nigg
iap, даты не пересекаются, то есть уникальны.
Тогда всё равно
13 фев 14, 13:05    [15562337]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
Nigg
Member

Откуда:
Сообщений: 29
Добрый Э - Эх,
Спасибо за ссылку, в принципе решил одним из способов описанных там (через Rank), но попробую и другие, может будет побыстрее работать!
13 фев 14, 13:15    [15562411]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строки слева от даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SELECT TOP(1)WITH TIES *
FROM Table1
WHERE OnDate<=@Date
ORDER BY RANK()OVER(PARTITION BY ID ORDER BY SIGN(DATEDIFF(DAY,OnDate,@Date)) DESC, DATEDIFF(DAY,OnDate,@Date));
Это если OnDate - типа дата-время,
"пусто" - это NULL

ORDER BY упорядочивает сначала так, что NULL оказывается последним,
а потом ненулловые даты по возрастанию разницы между ними и @Date

Так, наверно, будет правильно
13 фев 14, 13:42    [15562631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить