powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сравнение 2-х последовательных ячеек в столбце
17 сообщений из 17, страница 1 из 1
Сравнение 2-х последовательных ячеек в столбце
    #38530814
Novich12Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Help me! Please.

Я новичок и наверное поэтому не могу задать в гугле правильный запрос на мою проблему.
Задача такова.
Вот такая табличка

country sity rating
Russia Moscow 2
Russia Moscow 4
London UK 5
London UK 1

Для всех случаев когда страна и город имеют вторую оценку выше первой, то вывести эту страну и город.
В данном случае условию удовлетворяет - Russia Moscow
Я так понял, что это называется сравнение 2-х последовательных ячеек в столбце.
Именно для MySql я решения не нашел.

Спасибо!
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38530822
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Novich12Alex,

во-первых вам надо определить какая из строчек
СССР, Москва, 2
СССР, Москва, 4
является первой, а какая второй.
Без использовании сортировки по колонке
времени или по колонке ИД -- задача
будет неопределена

во-вторых, после определения порядка
посмотрите FAQ на предмет нумерации
строк в групах. затем попробуйте придумать
алгоритм решения сами.

Еше надо уточнить -- будут ли только пары
или записей с оченками может быть 10 для каждого города.
Может ли быть одна запись? что делать в таких случаях?
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38530850
Novich12Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

Это результат запроса, отсортированный как раз по дате. Т.е. не будет 10-ти записей или только одной, все уже ненужное отфильтровано. Вот этот момент надо сделать и задача решена. Колонку с датой я могу добавить.

Если сравнение 2-х последовательных ячеек в Mysql - задача непростая и требует много уточнений, то тогда видимо я использую неправильный подход для ее решения.

В этом случае, я могу всю задачу выложить, есть скрипт, с помощью которого можно по быстрому залить таблицы с данными...
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38530855
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Novich12Alex,

ok, тогда примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select 
  country,
  city,
  rating,
  date_col
from
(
select 
  if(@ctr=country AND @cty=city AND @rtn<rating, 'ok','notok') nnn,
  @ctr:=country country,
  @cty:=city city,
  @rtn:=rating rating,
  date_col
from 
  (...исходный набор данных...) t,
  (select @ctr:="z", @cty:="z", @rtn:=-999) z
order by 
  country, 
  city, 
  date_col
) zz
where nnn = 'ok'



предполагается что в исходных данных все города
имеют два вхождения.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38530937
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t.country, t.city -- , t.* 
from(
  select country, city, max(date)date, max(rating)rating
  from myTable
  group by country,city
  having min(rating)<max(rating)
  )g  
join myTable t on t.country = g.country and t.city=g.city and t.date=g.date and t.rating=g.rating
-- group by t.country, t.city
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531111
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

ваше решение не совем верное, но
подводит к такому:

Код: sql
1.
2.
3.
4.
5.
6.
7.
select t1.* 
from t t1
join t t2 on
  t1.country = t2.country
  t1.city = t2.city
  t1.rating > t2.rating
  t1.date_col > t2.date_col
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531144
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
  ...
from 
  (...исходный набор данных...) t,
  (select @ctr:="z", @cty:="z", @rtn:=-999) z
order by 
  country, 
  city, 
  date_col
) zz
where nnn = 'ok'



В последних версиях оптимизатор оптимизирует from подзапросы и такая конструкция, увы, работать не будет. Тут с примерами для разных версий разбирается.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531154
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanjavajdbc
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
  ...
from 
  (...исходный набор данных...) t,
  (select @ctr:="z", @cty:="z", @rtn:=-999) z
order by 
  country, 
  city, 
  date_col
) zz
where nnn = 'ok'



В последних версиях оптимизатор оптимизирует from подзапросы и такая конструкция, увы, работать не будет. Тут с примерами для разных версий разбирается.

хм, по ссылке -- интересная дискуссия.
Но похоже, ребята там не очень опытные в
использовании переменных и нарываются на
извесные грабли.

Мой вариант в этом топике должен быть намного стабильнее чем
варианты по ссылке.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531205
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,
Под граблями вы имеете в виду, что для двух условий через and не гарантируется тот же порядок исполнения, что и в запросе?
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531217
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcваше решение не совем верноено позвольте...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select t.country, t.city -- , t.* 
from(
  -- максимальные дата и рейтинг безотносительно к конкретной строке
  select country, city, max(date)date, max(rating)rating 
  from myTable
  group by country,city
  having min(rating)<max(rating)
  )g  
join myTable t on t.country = g.country and t.city=g.city 
  -- и только те строки, где наивысший рейтинг относится к более поздней дате
  and t.date=g.date and t.rating=g.rating
  -- то есть есть рейтинг ниже, но он относится к более ранним вариантам оценки
-- group by t.country, t.city
-- группировка предохраняет от ситуации, когда за одну дату выставлено несколько (в том числе одинаковых) оценок, 
-- чего по условиям задачи быть не должно

Обоснуйте, пожалуйста, ваше возражение...
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531276
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanjavajdbc,
Под граблями вы имеете в виду, что для двух условий через and не гарантируется тот же порядок исполнения, что и в запросе?

при беглом просмотре обсуждения по ссылке (и
другово обсуждения на которое ссылается первое),
я заметил следующее:

1. по ссылке переменные используются в where группе.
Это запрешено использовать всем кроме
юзера bochkov.

2. по ссылке переменные используются НЕ на том же уровне
селекта/подселекта на котором производится сортировка.
Если вы заметили , то мое решение включает
использование переменных только в СЕЛЕКТ и только
на томже уровне что и группировка.
По вашей ссылке обсуждается
потеря сортировки при переходе на следующий уровень.

3. недетерминированый порядок вычисления полей в
группе селект, как и недетерминированый порядок вычисления
условий через AND -- несколько раз упомянуты в литературе
как "возможная" проблема.
И даже предложены способы это избежать.
Но я ни разу не видел чтоб ктото показал чтоб порядок НЕ выполнялся.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38531278
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

таки да, вы правы -- ваше решение -- корректное 100%.
Приношу извинения.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38532626
Novich12Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто откликнулся!

Отдельное спасибо Cygapb-007!!!

Все заработало.
Разберу запрос на запчасти, чтобы окончательно понять как это работает ))
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38534564
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc
1. по ссылке переменные используются в where группе.
Это запрешено использовать всем кроме
юзера bochkov.Соглашусь частично: bochkov действительно пишет красивые запросы с переменными и использование переменных в части where требует особой осторожности.

А вот по второму пункту не понял вашу мысль.
javajdbc2. по ссылке переменные используются НЕ на том же уровне
селекта/подселекта на котором производится сортировка.И у вас точно также. From-подзапрос с сортировкой обеспечивает нужный порядок строк перед прохождением с переменными.

javajdbc2. Если вы заметили , то мое решение включает
использование переменных только в СЕЛЕКТ и только
на томже уровне что и группировка.А какая разница? Мой запрос с переменными в where можно переписать как ваш с дополнительным from-подзапросом и переменными в select.
При этом у вас предполагается, что порядок вычисления полей в части select такой же как и в запросе, а у меня, что порядок вычисления условий в where такой же как в запросе. По сути одинаковое допущение, но у вас лишний from-подзапрос.

Тот факт, что запрос с переменными в части where в версиях 5.5 не работает это, имхо, бага оптимизатора . Первоначально я ошибочно отнес это на потерю сортировки из-за ликвидации from-подзапроса.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38534829
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
....
javajdbc2. по ссылке переменные используются НЕ на том же уровне
селекта/подселекта на котором производится сортировка.

>>И у вас точно также. From-подзапрос с сортировкой обеспечивает
>> нужный порядок строк перед прохождением с переменными.

В моем решени порядок расчета переменных обеспечивается
ORDER BY на томже уровне на котором и вычисления.
Это в корне отличается от того что вы якобы увидели:
"From-подзапрос с сортировкой обеспечивает нужный порядок"

javajdbc2. Если вы заметили , то мое решение включает
использование переменных только в СЕЛЕКТ и только
на томже уровне что и группировка.

>> А какая разница? Мой запрос с переменными в where можно
>> переписать как ваш с дополнительным from-подзапросом и переменными в select.

По ссылке есть много разных запросов.
Для конкретности, приведите, пожалуйста, ваш пример.

>> При этом у вас предполагается, что порядок вычисления
>> полей в части select такой же как и в запросе, а у меня,
>> что порядок вычисления условий в where такой же как в
>> запросе. По сути одинаковое допущение, но у вас лишний from-подзапрос.

Тут надо чуть аккуратнее определить о чем дискуссия.
Есть две раные проблемы: (А) порядок вычисления записей
и (Б) порядок вычисления полей внутри одной записи.

(А) -- реальная проблема... которая распадается на две:

А-1 порядок вычисления в WHERE групе -- этот порядок
никогда не был гарантирован и крайне не рекомендуется

А-2 порядок вычисления в SELECT групе -- гарантирован
только если есть ORDER BY в том же уровне.
Не гарантирован без ORDER BY или если есть GROUP BY.

(Б) -- предпологается что это может быть проблемой
но ни разу я не видел доказательств что проблема сушествует

>> Тот факт, что запрос с переменными в части where в версиях 5.5 не работает это, имхо, бага оптимизатора . Первоначально я ошибочно отнес это на потерю сортировки из-за ликвидации from-подзапроса.

я не советую тратить всемя на обсуждения
работы переменных в WHERE блоке:
-- разное кеширование в марии и в мускл-е(по вашей ссылке)
-- влияние индексов (читал пару лет назад),
-- неопределеный порядок записей
Вроде бы достаточно :-)
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38535246
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcВ моем решени порядок расчета переменных обеспечивается
ORDER BY на томже уровне на котором и вычисления.
Это в корне отличается от того что вы якобы увидели:
"From-подзапрос с сортировкой обеспечивает нужный порядок"

Да, действительно, вы правы. Это я ваш запрос неправильно прочитал из-за отсутствия отступов.
...
Рейтинг: 0 / 0
Сравнение 2-х последовательных ячеек в столбце
    #38535520
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc
во-первых вам надо определить какая из строчек


В нулевых тебе (топикстартеру) надо ещё понять, что это -- реляционная база данных, а не эксель,
тут нет колонок и столбцов, тут есть записи и поля. Порядок записей не определён (это значит, что его нет).
А если тебе нужно такие задачи решать -- в Excel иди и там разбирайся.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сравнение 2-х последовательных ячеек в столбце
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]