Мне нужно написать запрос для таблицы, в которой записывается дата изменения значения в столбце. Таблица такова, что следующий запрос дает соответствующий результат.
SELECT
employeeId,
date,
location,
FROM
MY_TABLE
ORDER BY
employeeId, date, location
Результат:
+----+--------------+------------+------------------+
| | employeeId | date | location |
+====+==============+============+==================+
| 0 | 2467 | 2016-04-31 | COUNTRY A |
+----+--------------+------------+------------------+
| 1 | 2467 | 2016-05-31 | COUNTRY A |
+----+--------------+------------+------------------+
| 2 | 2467 | 2016-06-31 | COUNTRY A |
+----+--------------+------------+------------------+
| 3 | 2467 | 2016-07-31 | COUNTRY A |
+----+--------------+------------+------------------+
| 4 | 2467 | 2016-08-31 | COUNTRY B |
+----+--------------+------------+------------------+
| 5 | 2467 | 2017-09-31 | COUNTRY A |
+----+--------------+------------+------------------+
Для каждого employeeId, если местоположение изменяется между двумя датами, я хочу старую дату , старое местоположение, новая дата и новое местоположение. Вот запрос, который я написал:
WITH
cte AS (
SELECT
employeeId,
date,
location,
FROM
MY_TABLE),
movements AS (
SELECT
a.employeeId AS EMPLOYEEID,
b.employeeId AS EMPLOYEEID_NEW,
a.date AS OLD_DATE,
b.date AS NEW_DATE,
a.location AS OLD_LOCATION,
b.location AS NEW_LOCATION
FROM
cte a
INNER JOIN
cte b
ON
a.employeeId = b.employeeId
WHERE
b.date > a.date
AND DATE_DIFF(b.date, a.date, MONTH) = 1
AND a.location <> b.location
)
SELECT
NEW_DATE,
OLD_DATE,
COUNT(EMPLOYEEID) AS MOVED,
OLD_LOCATION,
NEW_LOCATION
FROM
movements
GROUP BY
NEW_DATE,
OLD_DATE,
EMPLOYEEID,
OLD_LOCATION,
NEW_LOCATION
ORDER BY
MOVED,
NEW_DATE,
OLD_LOCATION,
NEW_LOCATION
Я получаю следующие результаты:
+----+------------+------------+---------+----------------+----------------+
| | NEW_DATE | OLD_DATE | MOVED | OLD_LOCATION | NEW_LOCATION |
+====+============+============+=========+================+================+
| 0 | 2016-07-01 | 2016-06-01 | 1 | COUNTRY A | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 1 | 2016-07-01 | 2016-06-30 | 1 | COUNTRY A | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 2 | 2016-07-31 | 2016-06-30 | 1 | COUNTRY A | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 3 | 2016-07-31 | 2016-06-01 | 1 | COUNTRY A | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 4 | 2016-08-01 | 2016-07-01 | 1 | COUNTRY C | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 5 | 2016-08-01 | 2016-07-31 | 1 | COUNTRY C | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 6 | 2016-08-31 | 2016-07-01 | 1 | COUNTRY C | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
| 7 | 2016-08-31 | 2016-07-31 | 1 | COUNTRY C | COUNTRY B |
+----+------------+------------+---------+----------------+----------------+
Результаты не являются правильными. Я очень сомневаюсь, что количество перемещений между двумя странами всегда равно 1 ... Не могли бы вы взглянуть на запрос и сообщить мне, где я ошибаюсь? Кроме того, к вашему сведению, я запутал данные, представленные здесь. Я переключился на названия стран и даты, в основном.