Sqlite: select having
От: Аноним  
Дата: 31.01.11 11:48
Оценка:
Добрый день, всем.

Есть таблица:
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


Второй запрос как то не удается привести в рабочее состояние. Может я не в ту сторону копаю?
Re: Sqlite: select having
От: night beast СССР  
Дата: 31.01.11 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Есть таблица:

А>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
Re[2]: Sqlite: select having
От: Аноним  
Дата: 31.01.11 12:51
Оценка:
Здравствуйте, 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.
Re[3]: Sqlite: select having
От: night beast СССР  
Дата: 01.02.11 05:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ход мыслей понятен — спасибо.


А>Прежде всего хочу пояснить задачу: Мне это нужно для синхронизации, я хочу найти дату с которой нужно начать синхронизацию, т.е. записи со статусом < 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)
Re[4]: Sqlite: select having
От: Аноним  
Дата: 01.02.11 08:19
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.