Добрый день, всем.
Есть таблица:
Table1 ([Date] DATETIME, [Status] INTEGER)
В столбце [Status] находятся значения от 1 до 5.
Нужно выбрать из этой таблицы данные
1) Взять последнюю дату
SELECT [Date] FROM [Table1] order by [Date] desc limit 1
2) Но, если в базе существует строка где значение [Status] < 3 — тогда выбрать именно эту строку
SELECT [Date] FROM [Table1] order by [Date] desc HAVING WHERE [Status] < 3
Второй запрос как то не удается привести в рабочее состояние. Может я не в ту сторону копаю?
Здравствуйте, Аноним, Вы писали:
А>Есть таблица:
А>Table1 ([Date] DATETIME, [Status] INTEGER)
А>В столбце [Status] находятся значения от 1 до 5.
А>Нужно выбрать из этой таблицы данные
А>1) Взять последнюю дату
А>А> SELECT [Date] FROM [Table1] order by [Date] desc limit 1
А>
А>2) Но, если в базе существует строка где значение [Status] < 3 — тогда выбрать именно эту строку
А>А>SELECT [Date] FROM [Table1] order by [Date] desc HAVING WHERE [Status] < 3
А>
А>Второй запрос как то не удается привести в рабочее состояние. Может я не в ту сторону копаю?
совсем не в ту
SELECT (case when [Status] < 3 then 1 else 0 end) pwr, [Date] FROM [Table1] order by 1 desc,2 desc limit 1
Здравствуйте, night beast, Вы писали:
NB>совсем не в ту
NB>NB>SELECT (case when [Status] < 3 then 1 else 0 end) pwr, [Date] FROM [Table1] order by 1 desc,2 desc limit 1
NB>
Ход мыслей понятен — спасибо.
Прежде всего хочу пояснить задачу: Мне это нужно для синхронизации, я хочу найти дату с которой нужно начать синхронизацию, т.е. записи со статусом < 3 еще не законченная транзакция, поэтому при следующей синхронизации нужно еще раз обновить данные у которых статус < 3. Поэтому осталась маленькая проблемка:
Пример 1:
[Date] [Status]
2011-01-31 15:52:42 1
2011-01-31 15:53:00 2
2011-01-31 15:55:00 1
2011-01-32 13:02:00 5
2011-01-32 13:12:00 5
2011-01-32 13:22:00 5
Пример 2:
[Date] [Status]
2011-01-31 15:52:42 4
2011-01-31 15:53:00 5
2011-01-31 15:55:00 5
2011-01-32 13:02:00 5
2011-01-32 13:12:00 4
2011-01-32 13:22:00 5
Если сделать запрос на второй пример — все отлично, возьмет из базы последнюю дату 2011-01-32 13:22:00. Но если сделать запрос на первый пример, то запрос выдаст дату 2011-01-31 15:55:00 — а мне нужно чтобы запрос выдал 2011-01-31 15:52:42.
Здравствуйте, Аноним, Вы писали:
А>Ход мыслей понятен — спасибо.
А>Прежде всего хочу пояснить задачу: Мне это нужно для синхронизации, я хочу найти дату с которой нужно начать синхронизацию, т.е. записи со статусом < 3 еще не законченная транзакция, поэтому при следующей синхронизации нужно еще раз обновить данные у которых статус < 3. Поэтому осталась маленькая проблемка:
А>Пример 1:
А>[Date] [Status]
А>2011-01-31 15:52:42 1
А>2011-01-31 15:53:00 2
А>2011-01-31 15:55:00 1
А>2011-01-32 13:02:00 5
А>2011-01-32 13:12:00 5
А>2011-01-32 13:22:00 5
А>Если сделать запрос на второй пример — все отлично, возьмет из базы последнюю дату 2011-01-32 13:22:00. Но если сделать запрос на первый пример, то запрос выдаст дату 2011-01-31 15:55:00 — а мне нужно чтобы запрос выдал 2011-01-31 15:52:42.
я правильно понял, что при статус < 3 сортировка нужна в возрастающем порядке, а для статус > 3 в убывающем?
вижу два пути:
Способ 1: (для MsSql. Пойдет ли на Sqllite хз)
select 0 pwr, *
from (select top 1 * from Table1 where status < 3 order by date) t
union all
select 1 pwr, *
from (select top 1 * from Table1 where status >= 3 order by date desc) t
order by 1
Способ 2:
(case when status < 3 then -DATEDIFF(ss,'2000-01-01',data) else DATEDIFF(ss,'2000-01-01',data) end)
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Аноним, Вы писали:
А>>Ход мыслей понятен — спасибо.
А>>Прежде всего хочу пояснить задачу: Мне это нужно для синхронизации, я хочу найти дату с которой нужно начать синхронизацию, т.е. записи со статусом < 3 еще не законченная транзакция, поэтому при следующей синхронизации нужно еще раз обновить данные у которых статус < 3. Поэтому осталась маленькая проблемка:
А>>Пример 1:
А>>[Date] [Status]
А>>2011-01-31 15:52:42 1
А>>2011-01-31 15:53:00 2
А>>2011-01-31 15:55:00 1
А>>2011-01-32 13:02:00 5
А>>2011-01-32 13:12:00 5
А>>2011-01-32 13:22:00 5
А>>Если сделать запрос на второй пример — все отлично, возьмет из базы последнюю дату 2011-01-32 13:22:00. Но если сделать запрос на первый пример, то запрос выдаст дату 2011-01-31 15:55:00 — а мне нужно чтобы запрос выдал 2011-01-31 15:52:42.
NB>я правильно понял, что при статус < 3 сортировка нужна в возрастающем порядке, а для статус > 3 в убывающем?
NB>вижу два пути:
NB>Способ 1: (для MsSql. Пойдет ли на Sqllite хз)
NB>NB>select 0 pwr, *
NB>from (select top 1 * from Table1 where status < 3 order by date) t
NB>union all
NB>select 1 pwr, *
NB>from (select top 1 * from Table1 where status >= 3 order by date desc) t
NB>order by 1
NB>
NB>Способ 2:
NB>NB>(case when status < 3 then -DATEDIFF(ss,'2000-01-01',data) else DATEDIFF(ss,'2000-01-01',data) end)
NB>
Спасибо за помощь — решение найдено (2 способ).
Для Sqlite выглядит так:
SELECT (case when [Status] < 3 then strftime('%s','now') - strftime('%s',[Date]) else 1 end) pwr, [Date] FROM [Table1]
order by 1 DESC,2 DESC limit 1