Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный запрос, если предыдущее поле не изменилось 
:(
    Опции темы
xaoc2
Дата 13.4.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004

Репутация: нет
Всего: нет



Не могу составить запрос.
Есть таблица представляющяя динамику цен:
+---------------------------------------------------------------+
|  supplier_id  |  product_id  |    date            |  price  |
+-----------------------------------------------------+--------+
|        1           |        10         |  20061111     |  130    |
+---------------------------------------------------------------+
|        1           |        10         |  20061112    |  120    |
+---------------------------------------------------------------+
|        1           |        10         |  20061113    |  100    |
+---------------------------------------------------------------+
|        1           |        10         |  20061114    |  100     |
+---------------------------------------------------------------+
|        1           |       9            |  20061111    |  100     |
+---------------------------------------------------------------+
|        1           |        9           |  20061112    |  105    |
+---------------------------------------------------------------+
|        1           |        9           |  20061112    |  105     |
+---------------------------------------------------------------+
|        1           |        9           |  20061112    |  100     |
+---------------------------------------------------------------+

    Необходимо выбрать строки только если цена изменилась, то есть например четвёртая  и предпоследняя  строка не
должна попасть в запрос. 
То есть:
+---------------------------------------------------------------+
|  supplier_id  |  product_id  |    date            |  price  |
+-----------------------------------------------------+--------+
|        1           |        10         |  20061111     |  130    |
+---------------------------------------------------------------+
|        1           |        10         |  20061112    |  120    |
+---------------------------------------------------------------+
|        1           |        10         |  20061113    |  100    |
+---------------------------------------------------------------+
|        1           |       9            |  20061111    |  100     |
+---------------------------------------------------------------+
|        1           |        9           |  20061112    |  105    |
+---------------------------------------------------------------+
|        1           |        9           |  20061112    |  100     |
+---------------------------------------------------------------+
   Сервер MySQL 4.1.x

Это сообщение отредактировал(а) xaoc2 - 16.4.2007, 12:35
PM MAIL   Вверх
ТоляМБА
Дата 16.4.2007, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 5
Всего: 252



ИМХО одним запросом это не сделать - нужен проход по всем записям.
PM   Вверх
SergeBS
Дата 16.4.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



xaoc2, 
Уточни условия: какой сервер, выборка - для 1 product_id или всех?
PM MAIL   Вверх
Akina
Дата 16.4.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Можно было бы создавать нечто типа
Код

Select  supplier_id, product_id, min(date), price
From MyTable
Group By supplier_id, product_id, price

Однако такой запрос выкинет и строку 4.

Вообще в рамках TSQL таких вещей как сравнение двух записей выборки не делают. Реализуй это хранимой процедурой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
xaoc2
Дата 16.4.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004

Репутация: нет
Всего: нет



Подредактировал условие.
Код

Select  supplier_id, product_id, min(date), price
From MyTable
Group By supplier_id, product_id, price

Этот запрос сгрупирует всё по цене , а цена может повториться, так как она может опуститься, а затем подняться до прежнего уровня.
PM MAIL   Вверх
skyboy
Дата 16.4.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



JOIN есть в версии 4.х?
Код

SELECT `t1`.`product_id`,`t1`.`price`,`t2`.`price`
FROM `MyTable` `t1`
LEFT JOIN `MyTable` `t2`
ON `t1`.`product_id` = `t2`.`product_id` AND `t1`.`date`< `t2`.`date`
WHERE `t2`.`supplier_id` is NULL OR `t1`.`price` <> `t2`.price

Тут делается "замыкание" таблицы саму на себя  - получается набор пар цен для каждого товара. Вот только логику запроса надо доработать - тебе ведь не надо различие и между сегодня и завтра, и  между  сегодня и послезавтра! вот только дата у тебя отличается на один день для одного и того же товара, или могут быть записи с одинаковой датой?
PM MAIL   Вверх
boevik
Дата 19.4.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 6
Всего: 35



Код

SELECT DISTINCT a.[supplier_id], a.[product_id], a.[date], a.[price] 
FROM [prices] a 
    INNER JOIN [prices] b
         ON a.[supplier_id] = b.[supplier_id] and
        a.[product_id]    = b.[product_id]
WHERE (b.[date] = (SELECT MAX([date]) FROM [prices] c WHERE c.[date] < a.[date]) OR (SELECT MAX([date]) FROM [prices] c WHERE c.[date] < a.[date]) is NULL)
and a.price <> b.price


date должен отличаться хотя бы на 1 минуту. 


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

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

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.