Для такой задачи знаю три диалектонезависимых способа для выбора последней записи:
Через подзапрос
SELECT field1,
field2,
history_field -- поле, где хранится историчность
FROM table1 t1
WHERE t1.history_field = (SELECT max(history_field)
FROM table1
WHERE field1 = t1.field1)
AND field1 = 'some_value';
Через оконные функции
WITH cte AS (SELECT field1,
field2,
history_field,
RANK() OVER (PARTITION BY field1 ORDER BY history_field DESC) AS rnk
FROM table1
WHERE 1=1
AND field1 = 'some_value')
SELECT field1,
field2,
history_field
FROM cte
WHERE rnk = 1;
Через левый джойн к самой себе
SELECT t1.field1,
t1.field2,
t1.history_field
FROM table1 t1
LEFT JOIN table1 t2 ON t1.field1 = t2.field1
AND t1.history_field > t2.history_field
WHERE t2.field1 IS NULL
AND t1.field1 = 'some_value'
Теперь еще один знаю, но проприетарный для Postgres.
Все эти способы в моем понимании тождественны, но на разных базах (похоже, в зависмиости от объема таблиц и индексов) показываают разные результаты по быстродействию - иногда быстрее один, иногда другой. Гуру SQL разъясните, какой способ считается каноничным и наиболее предпочтителен к использованию?
НАСТРОЙКА КНОПОК ГРОМКОСТИ НА УПРАВЛЕНИЕ ЗВУКОМ НА ПРИСТАВКЕ
1.Сначала сбрасываем пульт:
OK + TV пока TV не мигнёт 2 раза потом код 977
2.Теперь снова OK + TV пока TV не мигнёт 2 раза потом код 0208 (если не сработает, пробуем код 1010)
P. S. работает начиная с версии rootfs.bin 5.24292.99. На очень старых пультах не работает
Для такой задачи знаю три диалектонезависимых способа для выбора последней записи:
Через подзапрос
Через оконные функции
Через левый джойн к самой себе
Теперь еще один знаю, но проприетарный для Postgres.
Все эти способы в моем понимании тождественны, но на разных базах (похоже, в зависмиости от объема таблиц и индексов) показываают разные результаты по быстродействию - иногда быстрее один, иногда другой. Гуру SQL разъясните, какой способ считается каноничным и наиболее предпочтителен к использованию?
НАСТРОЙКА КНОПОК ГРОМКОСТИ НА УПРАВЛЕНИЕ ЗВУКОМ НА ПРИСТАВКЕ
1.Сначала сбрасываем пульт:
OK + TV пока TV не мигнёт 2 раза потом код 977
2.Теперь снова OK + TV пока TV не мигнёт 2 раза потом код 0208 (если не сработает, пробуем код 1010)
P. S. работает начиная с версии rootfs.bin 5.24292.99. На очень старых пультах не работает