Мне трудно понять эту проблему, и я не мог найти ответы на эту конкретную проблему в любом месте:SQLITE-запрос, если последняя строка соответствует критериям, проверка строки, предшествующей ему, соответствует различным критериям (RESOLVED)
Скажем, у меня есть таблица, как это, я просто использовать фрукты в качестве примера:
Fruit | Date | Value
=================================
Apple | 1 | other_random_value
Apple | 2 | some_value_1
Apple | 3 | some_value_2
Pear | 1 | other_random_value
Pear | 2 | unexpected_value_1
Pear | 3 | some_value_2
Все будет упорядочен по фруктам, затем дату.
В принципе, если последняя строка (для каждого плода) является some_value_2, но предшествующей ей не является some_value_1, я хочу совместить именно эти плоды (т. Е. В этом случае, Pear).
Итак, some_value_2 Я всегда ожидаю, что придет после строки с определенным значением для этого конкретного фрукта, и если это не так, я хочу помечать ошибки против этих конкретных фруктов. Также было бы неплохо сопоставить случаи, когда ничего не предшествует some_value_2, хотя, если это слишком сложно, я мог бы сопоставить его отдельно и просто проверить, что some_value_2 не является первой строкой, которую я не думаю, будет сложным запросом.
EDIT: Кроме того, быть в состоянии сопоставить любые последовательные строки, где предыдущее значение является неожиданным, было бы неплохо, хотя я в основном забочусь о последних двух строках. Поэтому, если возможность сопоставления всех последовательных строк приводит к более простому и эффективному запросу, я могу пойти с этим. Я буду делать INSERT в одно и то же время (в таблице предупреждений), поэтому, если бы я мог обозначить его как ОШИБКУ, если это последние две строки и ПРЕДУПРЕЖДЕНИЕ, если это не так, это будет действительно изящно. Хотя я не знаю, с чего начать писать запрос, который делает это. Кроме того, наличие запроса, который хорошо работает, является обязательным, поскольку я буду использовать это через большой набор данных.
Любые идеи?
EDIT:
Это то, что я в конце концов, это довольно медленно, но если индекс Date, это не так уж плохо:
SELECT c.Id AS CId, c.Fruit AS CFruit,
c.Date AS CDate, c.Value AS CValue,
(SELECT Id
FROM fruits
WHERE Fruit = c.Fruit
AND Date >= c.Date
AND Id > c.Id
ORDER BY Date, Id) AS NId, n.Fruit AS NFruit,
n.Date AS NDate, n.Value AS NValue
FROM fruits AS c
JOIN fruits AS n ON n.Id = NId
ORDER BY c.Date, c.Id
Я мог бы попробовать метод Иоахима снова в какой-то момент, когда я понял, что получаю много результатов, о которых я не очень люблю. Или я мог бы даже попробовать включения двух-то и делегировать INFO/ERROR в зависимости от обстоятельств ...
EDIT: Я использовал тот же SELECT, заявление, что я использовал, чтобы получить НДИ, и использовать SELECT COUNT (*) вместо SELECT Id. Это сказало мне количество результатов после текущего. Затем я просто использовал оператор CASE, чтобы превратить его в логическое поле, называемое последним :). Поэтому я эффективно сочетал методы Николаса и Йоахима. Производительность по-прежнему кажется ОК, вероятно, потому что SQLite кэширует результаты. Спасибо всем :)
Почему вы предполагаете, что в таблице есть неотъемлемый порядок? Первое правило SQL состоит в том, что строки таблицы имеют только такой порядок, как ваш запрос_ говорит им. –
Я собираюсь заказать по дате, я не делал этого особенно ясно. Я переформулировал это. – user989266