2016-02-25 2 views
2

Я таблицы (таблица), похожее на это:Выбор мин строки

Date  Value 
20150201 5 
20150205 6 
20150206 0 
20150207 5 
20150208 0 
20150209 9 
20150219 7 

Я хочу, чтобы выбрать строку после последней «0» с минимальной встречаемости даты. В приведенном выше примере последнее 0 произошло на дату 20150208, поэтому я хочу выбрать строку после нее (одну с датой 20150209). Даты разные.

И, например, если нет значений со значением «0», следует выбрать строку с мин. Дата. Я использую SQL Server 2008R2. Таким образом, я не мог использовать функции окна LEAD и LAG здесь.

ответ

2

Вы можете получить последнюю строку с нулевым значением в SQL Server 2012+, выполнив:

select top 1 t.* 
from (select max(case when value = 0 then date end) over (order by date) as date0 
     from t 
    ) t 
where date > date0 or date0 is null 
order by date; 

В SQL Server 2008 можно использовать коррелированный подзапрос:

select top 1 t.* 
from t 
where t.date > nullif((select max(date) from t t2 where t2.value = 0), '1900-01-01') 
order by date; 

Примечание: В этом случае NULLIF() предпочтительнее COALESCE(), потому что SQL Server имеет определенную плохую реализацию COALESCE() - он дважды вычисляет первый аргумент.

+0

tnanks. Но можем ли мы как-то воздержаться от использования TOP. Я упростил этот вопрос для простой доставки вопроса. На самом деле есть еще один столбец (ID), а выше информация для ID = 1. Я хочу вернуть таблицу с указанной выше логикой для каждого ID. Спасибо – Sher

+0

Спасибо. я понял – Sher

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