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
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.