выбрать данные из последних 2 строк sql - PullRequest
1 голос
/ 22 сентября 2011

Я использую odbc-jdbc bridge в своем проекте, и мне нужно выбрать 2 фрагмента данных из database и сохранить данные в 2 variables на стороне java моего приложения. Вот пример моей таблицы.

SITE_ID ------- DEV_ID ------- SCHEDULE_TIME ------- VALUE_ENUM ------- IDX
---------------------------------------------------------------------------
1               3000           09:30:00              1                    1
1               3000           11:30:00              0                    2
1               3000           12:00:00              1                    3
1               3000           14:00:00              0                    4
1               3000           18:30:00              1                    5
1               3000           20:30:00              0                    6
1               4000           05:00:00              1                    1 
1               4000           13:30:00              0                    2
1               4000           16:30:00              1                    3
1               4000           18:30:00              0                    4

То, что я хочу сделать, это select SCHEDULE_TIME для последних 2 IDX, где DEV_ID равно 3000, поэтому я хотел бы сохранить 18:30:00 and 20:30:00 в переменных, некоторые примеры утверждений, которые я пробовал: :

select SCHEDULE_TIME from ARRAY_BAC_SCH_Schedule order by IDX desc limit 1 where DEV_ID = 3000
select SCHEDULE_TIME from ARRAY_BAC_SCH_Schedule order by IDX desc limit (1,1) where DEV_ID = 3000

SELECT TOP 1 SCHEDULE_TIME FROM ARRAY_BAC_SCH_Schedule WHERE DEV_ID = 3000 ORDER BY IDX DESC

Сейчас я просто беспокоюсь о том, как заставить оператор select работать в инструменте Query, прежде чем я реализую его на стороне Java. Спасибо, Говядина.

Ответы [ 6 ]

1 голос
/ 22 сентября 2011

Вы можете сделать это с помощью подзапросов:

select * from array_bac_sch_schedule where (value_enum,idx) in (select value_enum,idx from array_bac_sch_schedule where dev_id=3000) order by schedule_time desc limit 2;

Я взял value_enum и idx в качестве первичного ключа.

1 голос
/ 22 сентября 2011

Для SQL Server вы должны использовать

SELECT TOP 2 SCHEDULE_TIME from (select SCHEDULE_TIME FROM ARRAY_BAC_SCH_Schedule WHERE DEV_ID = 3000 ORDER BY IDX DESC) as inner

, как сказал вам Хемал.

Будьте осторожны с такими запросами, как

select TOP 2 SCHEDULE_TIME FROM ARRAY_BAC_SCH_Schedule WHERE DEV_ID = 3000 ORDER BY IDX DESC

, потому что это неправильно.SQL Server выполняет верхний, а затем порядок.

В PostgreSQL или MySQL вы должны использовать limit и конец запроса.Ограничение - после части where.

В Oracle вы должны использовать rownum внутри части where.

1 голос
/ 22 сентября 2011

Особенности могут немного отличаться в зависимости от вашей БД, но ваш запрос должен выглядеть примерно так:

SELECT TOP 2 SCHEDULE_TIME 
FROM ARRAY_BAC_SCH_Schedule
WHERE DEV_ID = 3000
ORDER BY IDX Desc

Или в одну строку:

SELECT TOP 2 SCHEDULE_TIME FROM ARRAY_BAC_SCH_Schedule WHERE DEV_ID = 3000 ORDER BY IDX Desc
1 голос
/ 22 сентября 2011

Я думаю

SELECT TOP 2 * from (select SCHEDULE_TIME FROM ARRAY_BAC_SCH_Schedule WHERE DEV_ID = 3000 ORDER BY IDX DESC) as inner
1 голос
/ 22 сентября 2011

если это mysql, то

 select SCHEDULE_TIME from ARRAY_BAC_SCH_Schedule where DEV_ID = 3000 order by IDX desc limit 2
1 голос
/ 22 сентября 2011

Может быть, я что-то упустил. Есть ли причина, по которой вы бы просто не побежали:

select SCHEDULE_TIME from ARRAY_BAC_SCH_Schedule order by IDX desc limit 2 where DEV_ID = 3000

Возвращает 2 строки, содержащие 20:30:00 и 18: 30: 00.

...