2015-08-13 4 views
-1

Обновлено:MySQL - получить минимальные и максимальные значения для идентификаторов в группе

ТАБЛИЦА: MYDATA

id trans_id CURRENT CUST_DATE 
    ------------------------------------ 
    16 2362  152.40 2015-05-11 
    16 2363  146.80 2015-05-26 
    16 1669  147.00 2015-06-16 
    16 1979  148.60 2015-07-06 
    16 2344  144.00 2015-08-06 
    104 1280  161.40 2015-05-29 
    104 1553  158.20 2015-06-10 
    104 1898  158.20 2015-06-29 
    104 2131  158.20 2015-07-15 
    104 2223  158.20 2015-07-27 
    104 2294  158.20 2015-08-03 

Мне нужен запрос, который будет возвращать первое и последнее значение тока в каждой группе идентификаторов Based на CUST_DATE.

Пара вещей указать:

  1. Я только показывает две идентификаторы в этом примере. В реальной таблице есть тысячи различных идентификаторов.
  2. trans_id - это автоматически увеличивающееся поле. Мой первоначальный запрос имел max (trans_id) и min (trans_id) ... который работал до тех пор, пока новая строка не была добавлена ​​с более ранним значением даты и не привела к естественному возрастанию, чтобы стать неаккуратным. Вы можете увидеть эту проблему на ID 16 в приведенной выше таблице.

Я уже ласкал этот кажущийся простой запрос в течение двух дней ... просто не могу обернуть вокруг себя голову.

Ожидаемый результат (плоская структура):

id CURRENT_MAX CURRENT_MIN 
    ------------------------------- 
    16 152.40  144.00 
    104 161.40  158.20 

ответ

0

SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE mydata 
    (`id` int, `trans_id` int, `CURRENT` double, `CUST_DATE` datetime) 
; 

INSERT INTO mydata 
    (`id`, `trans_id`, `CURRENT`, `CUST_DATE`) 
VALUES 
    (16, 2362, 152.40, '2015-05-11 00:00:00'), 
    (16, 2363, 146.80, '2015-05-26 00:00:00'), 
    (16, 1669, 147.00, '2015-06-16 00:00:00'), 
    (16, 1979, 148.60, '2015-07-06 00:00:00'), 
    (16, 2344, 144.00, '2015-08-06 00:00:00'), 
    (104, 1280, 161.40, '2015-05-29 00:00:00'), 
    (104, 1553, 158.20, '2015-06-10 00:00:00'), 
    (104, 1898, 158.20, '2015-06-29 00:00:00'), 
    (104, 2131, 158.20, '2015-07-15 00:00:00'), 
    (104, 2223, 158.20, '2015-07-27 00:00:00'), 
    (104, 2294, 158.20, '2015-08-03 00:00:00') 
; 

Запрос 1:

SELECT id, MIN(CURRENT), MAX(CURRENT) 
FROM mydata 
GROUP BY ID 

Results:

| id | MIN(CURRENT) | MAX(CURRENT) | 
|-----|--------------|--------------| 
| 16 |   144 |  152.4 | 
| 104 |  158.2 |  161.4 | 
0

Несколько строк разделяют один и тот же минимальный ток, так что я предполагаю, что вы хотите, чтобы все из них, как вы не указано иначе ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL 
, trans_id INT NOT NULL 
,CURRENT DECIMAL(5,2) 
,CUST_DATE DATE NOT NULL 
); 

INSERT INTO my_table VALUES 
(16 ,2362  ,152.40 ,'2015-05-11'), 
(16 ,2363  ,146.80 ,'2015-05-26'), 
(16 ,1669  ,147.00 ,'2015-06-16'), 
(16 ,1979  ,148.60 ,'2015-07-06'), 
(16 ,2344  ,144.00 ,'2015-08-06'), 
(104 ,1280  ,161.40 ,'2015-05-29'), 
(104 ,1553  ,158.20 ,'2015-06-10'), 
(104 ,1898  ,158.20 ,'2015-06-29'), 
(104 ,2131  ,158.20 ,'2015-07-15'), 
(104 ,2223  ,158.20 ,'2015-07-27'), 
(104 ,2294  ,158.20 ,'2015-08-03'); 

SELECT a.* 
    FROM my_table a 
    JOIN 
    (
     SELECT id, MAX(current) x_current FROM my_table GROUP BY id 
     UNION 
     SELECT id, MIN(current) x_current FROM my_table GROUP BY id 
    ) b 
    ON b.id = a.id AND b.x_current = a.current; 
    +-----+----------+---------+------------+ 
    | id | trans_id | CURRENT | CUST_DATE | 
    +-----+----------+---------+------------+ 
    | 16 |  2362 | 152.40 | 2015-05-11 | 
    | 16 |  2344 | 144.00 | 2015-08-06 | 
    | 104 |  1280 | 161.40 | 2015-05-29 | 
    | 104 |  1553 | 158.20 | 2015-06-10 | 
    | 104 |  1898 | 158.20 | 2015-06-29 | 
    | 104 |  2131 | 158.20 | 2015-07-15 | 
    | 104 |  2223 | 158.20 | 2015-07-27 | 
    | 104 |  2294 | 158.20 | 2015-08-03 | 
    +-----+----------+---------+------------+ 

или

SELECT a.* 
    FROM my_table a 
    JOIN 
     (
     SELECT id 
      , MAX(current) max_current 
      , MIN(current) min_current 
      FROM my_table 
     GROUP 
      BY id 
    ) b 
    ON b.id = a.id AND a.current IN (b.max_current,b.min_current); 

Поскольку этот вопрос был первым спросил, спецификация существенно изменилась. Новое требование слишком очевидно, чтобы беспокоиться.

+0

Клубника, извиняюсь за изменение спецификаций на вас, ребята. Спасибо за ответ. Я попробую повторить его через несколько дней. – rdugge

Смежные вопросы