Полагаю, если я понимаю, что вы написали, вы могли бы использовать: -
SELECT a,max(date), other FROM mytable GROUP BY a ORDER BY date;
обратите внимание, что другой столбец представляет другие столбцы (если есть)
Однако , другой столбец будет произвольным значением (из одного из сгруппированных столбцов), которое вполне может бытьтребуемое значение (в данном примере оно есть).
Согласно: -
Каждое выражение в наборе результатов затем оценивается один раз для каждой группыстрок. Если выражение является агрегатным выражением, оно оценивается по всем строкам в группе. В противном случае он оценивается по одной произвольно выбранной строке внутри группы. Если в наборе результатов имеется более одного неагрегированного выражения, все такие выражения оцениваются для одной и той же строки.
SQL как понял SQLite - SELECT
Более правильно, чтобы исключить произвольное значение (sic) для другой столбец , вы можете использовать: -
SELECT
a /* will always be the same and isn't arbritary */,
max(date) /* will be the maximum data */ AS date,
(SELECT other FROM mytable WHERE a = m.a AND date = m.date) AS other
FROM mytable AS m /* AS m allows the outer query to be distinguished from the inner query */
GROUP BY a /* this effectivel removes duplicates on the a column */
ORDER BY date
;
- Пример, показанный ниже, дает тот же результат.
Пример: -
Использование следующего для заполнения таблицы некоторыми сгенерированными данными тестирования: -
CREATE TABLE IF NOT EXISTS mytable (a TEXT, date TEXT, other);
WITH cte(count,a,date,other) AS
(
SELECT 1,1,date('now','+'||(random() % 30)||' days'),'other1'
UNION ALL SELECT count+1,abs(random()) % 20,date('now','+'||(abs(random()) % 30)||' days'), 'other'||(count+1) FROM cte LIMIT 100
INSERT INTO mytable (a,date,other) SELECT a,date,other FROM cte
;
SELECT * FROM mytable ORDER BY DATE DESC;
в этом случае: -
- Выделенные строки - это те, которые должны быть извлечены.
Затем, после выполнения вышеизложенного, запускается следующее
SELECT * FROM mytable WHERE a = a AND date = (SELECT MAX(date) FROM mytable);
SELECT * FROM mytable WHERE /*a = a AND*/ date = (SELECT MAX(date) FROM mytable);
/* Will only select 1 row per unique value of a BUT other will be an arbritary value not necessairlly the latest */
SELECT a,max(date), other FROM mytable GROUP BY a /* group by effectively display unique */;
SELECT
a /* will always be the same and isn't arbritary */,
max(date) /* will be the maximum data */ AS date,
(SELECT other FROM mytable WHERE a = m.a AND date = m.date) AS other
FROM mytable AS m
GROUP BY a
;
Первые два результата показывают, что a = aничего не делает, так как всегда будет верно.
Тридцатный запрос создает (неупорядоченный): -
- Отметьте галочкиприсваивается путем проверки значения другого из предыдущего результата.
- В этом случае этот более короткий запрос работает нормально, даже если значения других являются произвольными значениями (на самом деле это не так, поскольку это зависит от того, как планировщик запросов обрабатывает запрос).
Четвертый, более правильный, дает те же результаты: -
Результат 2 (ваш оригинальный запрос) и 3 (оригинал без а = а) производят: -
и: -