Выберите последнюю позицию той же строки в MySQL - PullRequest
1 голос
/ 13 июля 2020

Версия базы данных MySQL 5.5.62

Это моя таблица

+-----+---------------------+----------+--------------+
| sId | sDateHour           | sElement | sStatus      |
+-----+---------------------+----------+--------------+
|   1 | 2020-01-01 01:54:40 | 044572   | Registered   |
|   2 | 2020-01-01 02:02:11 | 035219   | Unregistered |
|   3 | 2020-01-01 02:36:01 | 044572   | Unregistered |
|   4 | 2020-01-01 02:36:06 | 020523   | Registered   |
|   5 | 2020-01-01 02:36:15 | 020523   | Unregistered |
|   6 | 2020-01-01 03:05:22 | 065164   | Unregistered |
|   7 | 2020-01-01 03:05:51 | 086113   | Registered   |
|   8 | 2020-01-01 03:49:09 | 086113   | Unregistered |
|   9 | 2020-01-01 03:58:58 | 070328   | Unregistered |
|  10 | 2020-01-01 04:15:15 | 065570   | Unregistered |
|  11 | 2020-01-01 04:27:29 | 045473   | Registered   |
|  12 | 2020-01-01 04:40:36 | 074000   | Unregistered |
|  13 | 2020-01-01 04:40:43 | 045473   | Unregistered |
|  14 | 2020-01-01 05:00:50 | 070245   | Unregistered |
|  15 | 2020-01-01 06:17:53 | 079107   | Registered   |
+-----+---------------------+----------+--------------+

Мне нужно выбрать последнюю позицию (поле sDateHour) той же строки значение sElement, когда sStatus значение Unregistered

Мне нужен этот возврат

+-----+---------------------+----------+--------------+
| sId | sDateHour           | sElement | sStatus      |
+-----+---------------------+----------+--------------+
|   2 | 2020-01-01 02:02:11 | 035219   | Unregistered |
|   3 | 2020-01-01 02:36:01 | 044572   | Unregistered |
|   5 | 2020-01-01 02:36:15 | 020523   | Unregistered |
|   6 | 2020-01-01 03:05:22 | 065164   | Unregistered |
|   8 | 2020-01-01 03:49:09 | 086113   | Unregistered |
|   9 | 2020-01-01 03:58:58 | 070328   | Unregistered |
|  10 | 2020-01-01 04:15:15 | 065570   | Unregistered |
|  12 | 2020-01-01 04:40:36 | 074000   | Unregistered |
|  13 | 2020-01-01 04:40:43 | 045473   | Unregistered |
|  14 | 2020-01-01 05:00:50 | 070245   | Unregistered |
+-----+---------------------+----------+--------------+

например,

В этом случае в таблице у меня есть тот же элемент 044572 значение

+-----+---------------------+----------+--------------+
| sId | sDateHour           | sElement | sStatus      |
+-----+---------------------+----------+--------------+
|   1 | 2020-01-01 01:54:40 | 044572   | Registered   |
|   3 | 2020-01-01 02:36:01 | 044572   | Unregistered |
+-----+---------------------+----------+--------------+

номер sId номер 3 новее (последняя позиция), чем sId no. 1, а значение sElement равно Unregistered

Мне нужно извлечь эту строку

И я безуспешно пробовал это решение, потому что набор пуст

mysql> SELECT
    *
FROM
    `tbl_elements` A
INNER JOIN (
    SELECT
        sStatus,
        sElement,
        MAX(sDateHour) LastDatetimeForElements
    FROM
        `tbl_elements`
    WHERE
        sStatus = 'Unregistered'
) B ON A.sElement = B.sElement
AND A.sDateHour = B.LastDatetimeForElements;
Empty set

Как решить эту проблему?

Пожалуйста, любые предложения ...

Моя таблица ниже

-- ----------------------------
-- Table structure for tbl_elements
-- ----------------------------
DROP TABLE IF EXISTS `tbl_elements`;
CREATE TABLE `tbl_elements` (
  `sId` int(11) NOT NULL AUTO_INCREMENT,
  `sDateHour` datetime DEFAULT NULL,
  `sElement` varchar(255) DEFAULT NULL,
  `sStatus` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`sId`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tbl_elements
-- ----------------------------
INSERT INTO `tbl_elements` VALUES ('1', '2020-01-01 01:54:40', '044572', 'Registered');
INSERT INTO `tbl_elements` VALUES ('2', '2020-01-01 02:02:11', '035219', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('3', '2020-01-01 02:36:01', '044572', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('4', '2020-01-01 02:36:06', '020523', 'Registered');
INSERT INTO `tbl_elements` VALUES ('5', '2020-01-01 02:36:15', '020523', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('6', '2020-01-01 03:05:22', '065164', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('7', '2020-01-01 03:05:51', '086113', 'Registered');
INSERT INTO `tbl_elements` VALUES ('8', '2020-01-01 03:49:09', '086113', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('9', '2020-01-01 03:58:58', '070328', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('10', '2020-01-01 04:15:15', '065570', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('11', '2020-01-01 04:27:29', '045473', 'Registered');
INSERT INTO `tbl_elements` VALUES ('12', '2020-01-01 04:40:36', '074000', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('13', '2020-01-01 04:40:43', '045473', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('14', '2020-01-01 05:00:50', '070245', 'Unregistered');
INSERT INTO `tbl_elements` VALUES ('15', '2020-01-01 06:17:53', '079107', 'Registered');

Решение

ДЕМО

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Используйте коррелированный подзапрос, который возвращает максимальное sDateHour для каждого sElement:

select t.*
from tbl_elements t 
where t.sStatus = 'Unregistered'
and t.sDateHour = (select max(sDateHour) from tbl_elements where sElement = t.sElement and sStatus = t.sStatus)

См. demo . Результатов:

> sId | sDateHour           | sElement | sStatus     
> --: | :------------------ | :------- | :-----------
>   2 | 2020-01-01 02:02:11 | 035219   | Unregistered
>   3 | 2020-01-01 02:36:01 | 044572   | Unregistered
>   5 | 2020-01-01 02:36:15 | 020523   | Unregistered
>   6 | 2020-01-01 03:05:22 | 065164   | Unregistered
>   8 | 2020-01-01 03:49:09 | 086113   | Unregistered
>   9 | 2020-01-01 03:58:58 | 070328   | Unregistered
>  10 | 2020-01-01 04:15:15 | 065570   | Unregistered
>  12 | 2020-01-01 04:40:36 | 074000   | Unregistered
>  13 | 2020-01-01 04:40:43 | 045473   | Unregistered
>  14 | 2020-01-01 05:00:50 | 070245   | Unregistered
1 голос
/ 13 июля 2020

Вам нужны GROUP BY sStatus, sElement

SELECT  A.*
FROM  `tbl_elements` A
INNER JOIN (
    SELECT
        sStatus,
        sElement,
        MAX(sDateHour) LastDatetimeForElements
    FROM
        `tbl_elements`
    WHERE sStatus = 'Unregistered'
    GROUP BY sStatus,
        sElement,
) B ON A.sElement = B.sElement
    AND A.sDateHour = B.LastDatetimeForElements
        AND A.sStatus = B.sStatus

и объединение для всего столбца для правильного сопоставления

0 голосов
/ 13 июля 2020

Вам нужно добавить GROUP BY для вашего inner query

 SELECT
*
FROM
`tbl_elements` A
INNER JOIN (
SELECT
    sStatus,
    sElement,
    MAX(sDateHour) LastDatetimeForElements
FROM
    `tbl_elements`
WHERE
    sStatus = 'Unregistered'
    GROUP BY sStatus, sElement  <----
) B ON A.sElement = B.sElement
AND A.sDateHour = B.LastDatetimeForElements;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...