SQL: Максимално обобщаване и групиране по заявка

Имам проблеми с моята SQL заявка. Имам следната Orders таблица

 id
 order_number_for_user
 user_id
 date

Искам да избера най-новата поръчка за потребител на определена дата (2015-01-19). Ето някои примерни данни

 id| order_number_for_user | user_id |    created      
-------+---------------+---------+---------------
 1 |                     1 |      10 | 2015-01-19
 2 |                     2 |      10 | 2015-01-19
 3 |                     1 |      20 | 2015-01-19
 4 |                     1 |      30 | 2015-01-19
 5 |                     1 |      40 | 2015-01-19
 6 |                     2 |      40 | 2015-02-30

Правилният изход е следният идентификатор на ред 2,3,4,5

Ето повредената заявка, която създадох

SELECT id FROM orders WHERE order_number_for_user = 
(SELECT max(order_number_for_user) FROM orders as orders2 
WHERE orders.user_id=orders2.user_id 
AND date(created) = date('2015-01-19'))

Редовете, избрани от тази заявка, са 1,2,3,4,5. Ред 1 не трябва да се избира, тъй като не е максималния номер на поръчка за потребител 10 за посочената дата.

Може ли някой да ми каже защо запитването ми е неправилно?


person user2158382    schedule 02.02.2015    source източник
comment
Използвате ли MySQL, SQL Server или друг?   -  person Lamak    schedule 02.02.2015
comment
Вашата заявка не трябва да избира ред 1, предвид вашите примерни данни.   -  person Gordon Linoff    schedule 02.02.2015


Отговори (3)


Вероятно искате това вместо това:

SELECT * 
FROM orders
WHERE id IN (
   SELECT MAX(id)
   FROM orders
   WHERE DATE(created) = '2015-01-19'
   GROUP BY user_id
) AS max_order_ids

Вътрешната/подзаявката получава максималния идентификатор за поръчките на всеки потребител за този конкретен ден. След това външната заявка извлича останалата информация за поръчката за тези идентификатори.

Вашата заявка не е правила никакво групиране, така че MAX() агрегатът има колебливи резултати.

person Marc B    schedule 02.02.2015

Използвайте INNER JOIN:

SELECT O1.id
FROM Orders AS O1
INNER JOIN (SELECT user_id, MAX(order_number_for_user) order_number_for_user 
            FROM Orders
            WHERE date(created) = date('2015-01-19')
            GROUP BY user_id) AS O2
    ON O1.user_id = O2.user_id
    AND O1.order_number_for_user = O2.order_number_for_user
WHERE date(O1.created) = date('2015-01-19')
person Lamak    schedule 02.02.2015

Имате нужда от подзаявка, за да намерите целия user_id и неговия максимален ред, тогава заявката ви ще работи както следва:

ИЗБЕРЕТЕ id FROM поръчки, (SELECT user_id, max(order_number_for_user) maxOrderNum FROM orders GRPOUP BY user_id) като orders2 където orders.user_id=orders2.user_id и orders.order_number_for_user = orders2.maxOrderNum И orders.date(created) = date('2015 -01-19'))

person Tony Wang    schedule 02.02.2015