Выберите отличную информацию от каждого пользователя, где время МАКС. - PullRequest
0 голосов
/ 21 февраля 2019

A имеет резервирование , которое выглядит примерно так:

id    payable      time       name     floor
 1      24       02:40:10   Benjamin   15th      
 2      36       02:29:10   Beverlyn   15th
 3      48       02:35:16   Benjamin   15th
 4      30       02:32:51   Beverlyn   15th

и заказы таблица, в которой хранятся детали заказов клиента.

id     product                
 1        A                   
 2        B               
 3        C                
 4        D               

Я хочу вернуть ТОЛЬКО последнюю запись от каждого пользователя , который вставлен.Примерно так:

  payable      time       name    floor    product
    24       02:40:10   Benjamin   15th      A  
    30       02:32:51   Beverlyn   15th      D

попытка запроса:

SELECT reservation.payable, reservation.time, reservation.name, reservation.floor, orders.product
FROM orders
INNER JOIN reservation
ON orders.id = reservation.id 
WHERE reservation.time =
(SELECT MAX(time)
FROM reservation)
&& reservation.floor='15th';

проблема в том, что она возвращает только запись SINGLE , которые в последний раз вводили четные имена, пользователей разных,Который в случае только возвращает это:

 payable      time       name    floor    product
    24       02:40:10   Benjamin   15th      A 

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Вы можете попробовать что-то вроде этого:

/* Create tables */

CREATE TEMP TABLE orders AS 
(
SELECT 1 AS id, 'A' AS product UNION
SELECT 2, 'B' UNION
SELECT 3, 'C' UNION
SELECT 4, 'D'
);

CREATE TEMP TABLE reservations AS 
(
SELECT 1 AS id, 24 AS payable, '02:40:10'::TIME AS time, 'Benjamin' AS name, '15th' AS floor UNION
SELECT 2, 36 , '02:29:10 '::TIME, 'Beverlyn', '15th'UNION
SELECT 3, 48 , '02:35:16'::TIME, 'Benjamin', '15th'UNION
SELECT 4, 30 , '02:32:51 '::TIME, 'Beverlyn', '15th'
);

/* Final Selection */

SELECT a.id
       , a.payable
       , a.time
       , a.name
       , a.floor
       , b.product
FROM reservations a
LEFT JOIN orders b on a.id = b.id
WHERE (name, time) IN (SELECT name, MAX(time) AS time
                       FROM reservations
                       GROUP BY 1)
ORDER BY 1;

Также вы можете использовать оконные функции.

0 голосов
/ 21 февраля 2019

Использование объединений -

SELECT     t1.payable, 
           t1.time, 
           t1.NAME, 
           t1.floow, 
           t3.product 
FROM       reservation t1 
INNER JOIN 
           ( 
                    SELECT   Max(time) max_time, 
                             NAME 
                    FROM     reservation 
                    GROUP BY NAME) t2 t1.NAME=t2.NAME 
AND        t1.time=t2.max_time 
INNER JOIN product t3 
ON         ( 
                      t1.id=t3.id)
0 голосов
/ 21 февраля 2019
SELECT r.payable, r.time, r.name, r.floor, o.product
FROM orders as o
INNER JOIN reservation as r
ON o.id = r.id 
WHERE r.time =
(SELECT MAX(time)
FROM reservation  where name=r.name)
&& r.floor='15th';
0 голосов
/ 21 февраля 2019

использовать связанный подзапрос

SELECT r.*,o.product
FROM reservation r
join order o ON o.id = r.id 
where r.time =( select max(time) from reservation r1 where r1.name=r.name)
...