Intereting Posts
Отсутствует параметр IN или OUT при ошибке index :: 1 в Java, Oracle AJAX – несколько данных Обнаружение и обработка, когда запрос базы данных идет не так Запрос, настаивающий на столбцах в столбцах сопоставления предложения «Порядок по» в предложении «Группировать по» Как получить определенные значения записи из базы данных SQL, хранящейся на сервере, и обновить эти значения в базе данных SQLite для Android? Получить имя столбца свойства, сопоставленного с Hibernate Надежный подход к программированию SQL-запросов Условное ОБНОВЛЕНИЕ в MySql Обновление записи из другой таблицы Нормализовать данные транзакций от столбцов времени и состояния до минут на значение состояния Как написать полный запрос внешнего соединения в доступе Подсчитайте различные значения Найти максимальное значение и показать соответствующее значение из другого поля в MS Access Практическое руководство. Сопоставление (пространство поиска) с (объединение с столбцом из другой таблицы) Колонка с альтернативными сериалами

нахождение последней последовательной строки

Мне нужна помощь с запросом.

У меня есть эта простая таблица:

CREATE TABLE `consecutiv` ( `id` int(11) NOT NULL auto_increment, `readVal` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1; insert into `consecutiv`(`id`,`readVal`) values (1,2),(2,2),(3,2),(5,3),(6,3),(7,3),(8,3),(9,4),(10,5),(11,6),(12,6),(13,2),(14,2),(15,6); 

Выглядит так:

 id readVal 1 2 2 2 3 2 5 3 6 3 7 3 8 3 9 4 10 5 11 6 12 6 13 2 14 2 15 6 

Я хочу получить для данного readVal последнюю последовательную строку:

В приведенном выше примере это будет:

id: 3 для readVal = 2

id: 8 для readVal = 3

 ... 

Я пробовал с этим запросом:

 SELECT consecutiv.id, consecutiv.readVal, c.id, c.readVal FROM consecutiv JOIN consecutiv c ON consecutiv.id = c.id-1 WHERE consecutiv.readVal!=c.readVal ORDER BY consecutiv.id ASC 

И он работает до тех пор, пока в серии нет отсутствующих идентификаторов. В приведенном выше примере id 4 отсутствует, и запрос не возвращает ожидаемый результат.

Спасибо!

 SELECT a.id, a.readVal FROM consecutiv a WHERE a.readVal != (SELECT b.readVal FROM consecutiv b WHERE b.id > a.id ORDER BY id ASC LIMIT 1) ORDER BY a.id; 

возвращает:

  id | readval ----+--------- 3 | 2 8 | 3 9 | 4 10 | 5 12 | 6 14 | 2 

для случая, когда нужна последняя строка:

 SELECT c.id, c.readVal, c.nextReadVal FROM (SELECT a.id, a.readVal, (SELECT b.readVal FROM consecutiv b WHERE b.id > a.id ORDER BY id ASC LIMIT 1) AS nextReadVal FROM consecutiv a) AS c WHERE readVal != nextReadVal OR nextReadVal IS NULL ORDER BY c.id; 

возвращает:

  id | readval | nextreadval ----+---------+------------- 3 | 2 | 3 8 | 3 | 4 9 | 4 | 5 10 | 5 | 6 12 | 6 | 2 14 | 2 | 6 15 | 6 |