Выбор строки перед набором результатов в sqlite - PullRequest
2 голосов
/ 20 августа 2010

Допустим, у меня есть таблица с именем data

data

id | date      | name
---------------------    
1  | 19/8/2010 | John    
2  | 19/8/2010 | Mary    
3  | 20/8/2010 | Peter    
4  | 20/8/2010 | Bert     
5  | 20/8/2010 | Ernie 

, если я сделаю оператор выбора вроде этого

SELECT * FROM data where date = '20/8/2010';

Можно ли отредактировать этот оператор выбора, чтобы взять строку перед ним?в этом случае он возвращает мне строки с номерами 3 - 5. но можно ли каким-либо образом редактировать sqlstatement, чтобы выбрать строку 2?

Ответы [ 6 ]

2 голосов
/ 20 августа 2010

Я ничего не знаю о SQLITE, но для SQL Server, например, я мог бы сделать что-то вроде:

SELECT * FROM (SELECT TOP 1 * FROM data where date < '20/8/2010' ORDER BY date DESC, id DESC)
UNION
SELECT * FROM data where date = '20/8/2010'
;

Это предполагает, что ваши критерии для «строки перед» это строканаибольшая дата <дата, к которой вы обратились, и если эта дата имеется более чем в одной строке, то возьмите дату с максимальным идентификатором. </p>

1 голос
/ 20 августа 2010
Select Id, [Date], Name
From MyTable
Where [Date] = '2010-08-20'
Union All
Select Id, [Date], Name
From MyTable
Where Id = (
            Select Max(T2.Id)
            From MyTable As T2
            Where T2.[Date] < '2010-08-20'
            )
1 голос
/ 20 августа 2010

Адаптация @ решения SteveCav к UNION с исходным запросом:

SELECT d.* 
FROM   data d
JOIN   (
          SELECT MIN(id) lowest_id
          FROM   data 
          WHERE  date = '20/8/2010'
       ) dt ON (dt.lowest_id - 1 = d.id)
UNION
SELECT * 
FROM   data 
WHERE  date = '20/8/2010';

Контрольный пример (протестирован в sqlite 3):

CREATE TABLE data (id int, date date, name varchar(10));

INSERT INTO data VALUES (1, '19/8/2010', 'John');
INSERT INTO data VALUES (2, '19/8/2010', 'Mary');
INSERT INTO data VALUES (3, '20/8/2010', 'Peter');
INSERT INTO data VALUES (4, '20/8/2010', 'Bert');
INSERT INTO data VALUES (5, '20/8/2010', 'Ernie');

Результат:

id          date        name      
----------  ----------  ----------
2           19/8/2010   Mary      
3           20/8/2010   Peter     
4           20/8/2010   Bert      
5           20/8/2010   Ernie 

Предполагается, что под «строкой перед» подразумевается строка с предыдущим значением id.

1 голос
/ 20 августа 2010
Select d.* 
from data d, 
(SELECT min(id) As LowestID FROM data where date = '20/8/2010') m
where d.id=m.LowestID-1
0 голосов
/ 20 августа 2010

Как только вышеуказанный результат запроса станет доступен в текущем списке, вы можете получить доступ к любой из возвращенных строк с помощью курсора.

0 голосов
/ 20 августа 2010

Может быть, это близко к тому, что вы хотите:

 SELECT * FROM data where date <= '20/8/2010' order by date desc;

и затем прекратите чтение из результата после того, как у вас будет первая строка до 20 августа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...