Sqlite: выбор записей по всем записям - PullRequest
2 голосов
/ 28 апреля 2010

У меня есть вопрос sql / sqlite. Мне нужно написать запрос, который выбирает некоторые значения из таблицы базы данных sqlite. Я всегда хочу, чтобы максимальное количество возвращаемых записей было равно 20. Если общее количество выбранных записей превышает 20, мне нужно выбрать 20 записей, которые распределены равномерно (без случайных чисел) по всем записям. Также важно, чтобы я всегда выбирал первое и последнее значение из таблицы при сортировке по дате. Эти записи должны быть вставлены первыми и последними в результате.

Я знаю, как сделать это в коде, но было бы идеально иметь запрос sqlite, который может сделать то же самое.

Запрос, который я использую сейчас, очень прост и выглядит следующим образом:

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)"

Если у меня, например, есть эти записи в талбе и для упрощения примера, максимальный результат, который я хочу получить - 5.

id    value    date
 1     10       2010-04-10
 2      8       2010-04-11
 3      8       2010-04-13
 4      9       2010-04-15
 5     10       2010-04-16
 6      9       2010-04-17
 7      8       2010-04-18
 8     11       2010-04-19
 9      9       2010-04-20
 10    10       2010-04-24

Результат, который я хотел бы получить, распределяется равномерно следующим образом:

id    value    date
 1     10       2010-04-10
 3      8       2010-04-13
 5     10       2010-04-16
 7      8       2010-04-18
 10    10       2010-04-24

Надеюсь, что объясните, что я хочу, спасибо!

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Что-то вроде этого должно работать для вас:

SELECT *
FROM (
    SELECT v.value, v.date, v.valueid 
    FROM tblvalue v
    LEFT OUTER JOIN (
        SELECT min(DATE(date)) as MinDate, max(DATE(date)) as MaxDate
        FROM tblvalue 
        WHERE tblvalue.deleted = 0 
    ) vm on DATE(v.date) = vm.MinDate or DATE(v.date) = vm.MaxDate
    WHERE tblvalue.deleted = 0 
    ORDER BY vm.MinDate desc, Random()
    LIMIT 20
) a
ORDER BY DATE(date)    
0 голосов
/ 28 апреля 2010

Я думаю, вы хотите это:

SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 
ORDER BY DATE(date), Random()
LIMIT 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...