【发布时间】:2020-05-02 13:55:33
【问题描述】:
我需要为记录列中值更改日期的表编写查询。该表使得以下查询产生相应的结果。
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 ......你能看看这个查询,让我知道我在哪里出错了吗?另外,仅供参考,我已经混淆了此处提供的数据。基本上,我换了国家名称和日期。
【问题讨论】:
标签: mysql sql postgresql google-bigquery