LINUX.ORG.RU

поскольку функций для дат особо там похоже нет, могу предложить сделать косты^Wтабличку month_names (name, number), джойнить ее в запросе, ну и использовать значение number в агрегате MAX

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 1)

Да, делать JOIN с таблицей, содержащей числовые значения месяцев.

Таблицу можно как в БД держать, так и в сам запрос целиком засунуть, благо она не велика.

wandrien ★★
()
Ответ на: комментарий от wandrien

Это, однако, не отменяет необходимость выразить глубокое возмущение человеку, который так спроектировал таблицы (если он в зоне доступа, разумеется).

hobbit ★★★★★
()

Попробуй так

SELECT * 
FROM a_table
ORDER BY 
  CASE month
    WHEN 'январь' THEN 0
    WHEN 'февраль' THEN 1
    ...
  END
DESC
LIMIT 1

urxvt ★★★★★
()

Почитай про агрегатные функции и group by. В жизни пригодится

rtxtxtrx
()
SELECT * FROM (
	SELECT 
		tt.*
		,ROW_NUMBER () OVER(PARTITION BY tt.id, tt.cor_date /*...*/ ORDER BY m.column2 DESC) AS rn
	FROM test_tab1 tt 
	LEFT JOIN (
		SELECT * FROM (
			VALUES
				('янв', 1),('фев', 2),('мар', 3),
				('апр', 4),('май', 5),('июн', 6),
				('июл', 7),('авг', 8),('сен', 9),
				('окт', 10),('ноя', 11),('дек', 12)
		)
	) m ON m.column1 = substr(tt.mon_text,1,3)
) x
WHERE x.rn = 1;

о как SQLite умеет, оказывается )

Toxo2 ★★★★
()

Записи в таблице где месяцы написаны текстом: «январь» и т.д

Сделать из дат говна нормальные и выбрать.

crutch_master ★★★★★
()
Ответ на: комментарий от bad_master

что это за жесть?

если не любите оконные функции, тогда так:

WITH cte_cal(pref, num) AS (
	SELECT * FROM (
		VALUES
			('янв', 1),('фев', 2),('мар', 3),
			('апр', 4),('май', 5),('июн', 6),
			('июл', 7),('авг', 8),('сен', 9),
			('окт', 10),('ноя', 11),('дек', 12)
	)
)
,cte_ord AS (
	SELECT *
	FROM test_tab1 tt
	LEFT JOIN cte_cal m ON m.pref = substr(tt.mon_text,1,3)
)
SELECT
	o1.id, o1.cor_date, o1.mon_text
FROM
	cte_ord o1
WHERE 
	o1.num = (
		SELECT max(o2.num) FROM cte_ord o2 WHERE o1.id = o2.id AND o1.cor_date = o2.cor_date
	)
;

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

не я про то что у решения есть более короткое решение, а у тебя джоин, да всякие встроенные функции

bad_master
() автор топика

чёто вспомнилось: https://www.smart-jokes.org/programmer-evolution.html

собственно в зависимости от sql:

сделай вычисляемое поле в запросе с простейшим поиском по подстроке и группировкой по максимуму:

..., max(possubinstr(month,'январь февраль март апрель май июнь июль август сентябрь октябрь ноябрь декабрь'),...

group by *

где possubinstr - псевдоним(в разных sql разное) функции поиска позиции подстроки в строке

qulinxao3
()

если же угорать по короткости:

subst(‘нвеварпрайюнюлвгенктояек’,второй и третий символ в названии месяца)

qulinxao3
()
Ответ на: комментарий от qulinxao3

вы невероятно круты, как обычно )

я так не умею.

Так-то я просто удивился, что SQLite умеет во взрослый SQL, с окнами и cte. Это мне показалось забавным.

Вот в group by all он точно не умеет, но не суть )

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Ответ на: комментарий от Toxo2

sql разный и для доставки месаги словосочетание group by all добровольцем резолвится в частности в sqlite вариант

хз как по скорости

мне лично нравится быть лаконичным

поиск двухбуквия показался таковым

возможно есть какая либо простая функция отображающая имена месяцев в нужный порядок - однако это скорее всего привяжет к той или иной кодировке - в отличии от латиницы в которой едсак вроде как вс> и достоточно ascii

по сути нужно от им>н уметь в упорядоченное хэширование :)

qulinxao3
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.