Обновить
0
0

Пользователь

Отправить сообщение

Для такой задачи знаю три диалектонезависимых способа для выбора последней записи:

  1. Через подзапрос

     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';
  2. Через оконные функции

    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;
  3. Через левый джойн к самой себе

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. На очень старых пультах не работает

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность