Могу ли я объединить данные из самых старых и старых строк, сгруппированных по? - PullRequest
0 голосов
/ 03 ноября 2019

Я бы хотел как-то объединить эти результаты MySQL 5.6. Идея состоит в том, чтобы получать данные из самых последних и самых старых строк каждого идентификатора. Значения времени / идентификатора пары уникальны.

Таблица:

| time                | id | titulo   | precio | vendidos |
+---------------------+----+----------+--------+----------+
| 2019-10-26 19:12:14 | 1  | apple_a  | 2      | 10       |
| 2019-10-26 19:12:14 | 2  | pea      | 3      | 7        |
| 2019-10-26 19:12:14 | 3  | orange_a | 1      | 4        |
| 2019-10-28 19:12:14 | 3  | orange_a | 2      | 12       |
| 2019-10-28 19:12:14 | 4  | banana   | 5      | 7        |
| 2019-10-28 19:12:14 | 5  | peach    | 9      | 1        |
| 2019-10-29 19:12:14 | 1  | apple_b  | 2      | 12       |
| 2019-10-29 19:12:14 | 2  | pea      | 3      | 9        |
| 2019-10-29 19:12:14 | 3  | orange_b | 2      | 19       |
| 2019-10-29 19:12:14 | 4  | banana   | 6      | 14       |
| 2019-10-30 19:12:14 | 1  | apple_b  | 3      | 17       |
| 2019-10-30 19:12:14 | 2  | pea      | 3      | 11       |

С кодом:

-- Get latest rows for each id:
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC
;

-- Get oldest rows for each id:
SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC
;

Результат:

|                time | id |   titulo | precio | vendidos |
|---------------------|----|----------|--------|----------|
| 2019-10-30 19:12:14 |  1 |  apple_b |      3 |       17 |
| 2019-10-30 19:12:14 |  2 |      pea |      3 |       11 |
| 2019-10-29 19:12:14 |  3 | orange_b |      2 |       19 |
| 2019-10-29 19:12:14 |  4 |   banana |      6 |       14 |
| 2019-10-28 19:12:14 |  5 |    peach |      9 |        1 |

|                time | id |   titulo | precio | vendidos |
|---------------------|----|----------|--------|----------|
| 2019-10-26 19:12:14 |  1 |  apple_a |      2 |       10 |
| 2019-10-26 19:12:14 |  2 |      pea |      3 |        7 |
| 2019-10-26 19:12:14 |  3 | orange_a |      1 |        4 |
| 2019-10-28 19:12:14 |  4 |   banana |      5 |        7 |
| 2019-10-28 19:12:14 |  5 |    peach |      9 |        1 |

SQL Fiddle:

http://sqlfiddle.com/#!9/a9fafc/1

Как можно объединить оба выбораполучить данные из самых старых и последних строк? Желательно пропустить самые старые и последние строки, которые совпадают (например, id 5, «персик»)

Желаемый результат:

|                time | id |   titulo | precio | vendidos |         oldest_time | oldest_precio | oldest_vendidos |
|---------------------|----|----------|--------|----------|---------------------|---------------|-----------------|
| 2019-10-30 19:12:14 |  1 |  apple_b |      3 |       17 | 2019-10-26 19:12:14 |             2 |              10 |
| 2019-10-30 19:12:14 |  2 |      pea |      3 |       11 | 2019-10-26 19:12:14 |             3 |               7 |
| 2019-10-29 19:12:14 |  3 | orange_b |      2 |       19 | 2019-10-26 19:12:14 |             1 |               4 |
| 2019-10-29 19:12:14 |  4 |   banana |      6 |       14 | 2019-10-28 19:12:14 |             5 |               7 |

Я не понимаю, какэто может быть сделаноЯ попробовал некоторые вещи, которые закончились с неправильными результатами. Так кто-нибудь здесь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Будет ли это решением для вас:

select * from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos

DEMO

И поэтому результат такой же, как в вашем вопросе:

select one_t.time
      , one_t.id
      , one_t.titulo
      , one_t.precio
      , one_t.vendidos
      , two_t.time as oldest_time
      , two_t.precio as oldest_precio 
      , two_t.vendidos as oldest_vendidos  from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos

DEMO

0 голосов
/ 03 ноября 2019

Ты почти у цели. Прямо сейчас у вас есть 2 запроса, возвращающие необходимую информацию. Вам просто нужно объединить их.

SELECT a.latest as time,a.id,a.titulo,a.precio,a.vendidos,b.oldest as oldest_time, b.precio as oldest_precio, b.vendidos as oldest_vendidos
FROM (
    SELECT id, MAX(time) AS latest, title, precious, vendidos
    FROM srapedpubs t 
    GROUP BY id
) a
INNER JOIN (
    SELECT id, MAX(time) AS oldest, title, precious, vendidos
    FROM srapedpubs
    GROUP BY id
) b
ON b.id=a.id
WHERE b.oldest <> a.latest
ORDER BY id ASC;
...