LINUX.ORG.RU

Помогите составить SQL-запрос

 , , ,


0

3

Всем привет!

Поможите чем можите sql-нубу(!

Есть следующая таблица products (к схеме не придираться):

id INTEGER,
product_name varchar(100),
date_sale timestamp

В таблице могут быть данные вида:

1 Яблоко 2015-01-01,
2 Арбуз 2010-04-20,
...
2345 Яблоко 2017-01-10
и т.д

Требуется отобрать последние пять продаж товара по каждому из товаров (product_name). Проводить декомпозицию таблицы нельзя (в причины не буду вдаваться).

Как составть такой запрос?

P.S. Заранее спасибо.


Наймите программиста.

anonymous
()

последние пять продаж товара по каждому из товаров

Ну тут точно аналитический запрос, с rank parition by и т.д, только я так понимаю в mysql аналитических запросов нет.

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

ну по двухминутному гуглению я нашел вот такую дичь - как раз то что нужно ТС
https://habrahabr.ru/sandbox/28184/

rank

скорее уж row_number

в mysql аналитических запросов нет.

да? как же тогда хорошо, что я с ним никогда не работал

Deleted
()

Если количество товаров известно, невелико, и не изменяется, тогда можно собрать результаты по каждому и склеить через union.
А так да, нужны аналитические функции, но их эмуляция в mysql выглядит прямо скажем не очень.

pru-mike ★★
()

Aber, duraki, pru-mike

Зачем аналитические функции?


  select 
    t1.product_name, 
    t1.date_sale, 
    count(t2.id) as pos_number
  from PRODUCTS as t1
  left join PRODUCTS as t2
  on t1.product_name = t2.product_name 
    and t1.date_sale <= t2.date_sale
  group by t1.product_name
    and t1.date_sale
  having pos_number < 5

пишу без БД. могут быть неточности

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

А. да, кажется так подойдет.
group by по-моему там через запятую

pru-mike ★★
()
Ответ на: комментарий от bvn13

клево, да, это должно сработать. но только если data_sale не повторяются для одного product_name

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.