Как написать запрос BigQuery для поиска строк, где в таблице изменяется указанный столбец c - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно написать запрос для таблицы, в которой записывается дата изменения значения в столбце. Таблица такова, что следующий запрос дает соответствующий результат.

  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 ... Не могли бы вы взглянуть на запрос и сообщить мне, где я ошибаюсь? Кроме того, к вашему сведению, я запутал данные, представленные здесь. Я переключился на названия стран и даты, в основном.

1 Ответ

0 голосов
/ 05 мая 2020

Мне не удалось определить в вашем запросе, как вы выбрали предыдущую дату и местоположение. Тем не менее, я смог упростить его и добиться того, к чему вы стремитесь.

Во-первых, я немного изменил ваши фиктивные данные, чтобы проверить некоторые случаи. Таким образом, я использовал следующее:

employeeId|date|location
2467|2016-04-30|COUNTRY A
2467|2016-05-31|COUNTRY A
2467|2016-06-30|COUNTRY B
2467|2016-07-31|COUNTRY A
2467|2016-08-31|COUNTRY B
2467|2017-09-30|COUNTRY A
2468|2017-09-30|COUNTRY A
2468|2017-09-30|COUNTRY A

Обратите внимание, что employeeId 2467 меняет страны 4 раза.

Я создал следующий скрипт:

WITH data AS (
SELECT employeeid, date, location, (LAG(date) OVER (PARTITION BY employeeid ORDER BY date ASC)) AS prev_date,
        (LAG(location) OVER (PARTITION BY employeeid ORDER BY date ASC)) AS prev_loc
FROM `test-proj-261014.bq_load_codelab.employee`
ORDER BY date
)
SELECT * FROM data
WHERE DATE_DIFF(date, prev_date, MONTH)>=1 
  AND prev_loc IS NOT NULL
  AND location<>prev_loc
 ORDER BY date

Как видите, я использовал функцию LAG () , чтобы выбрать предыдущую дату и местоположение для каждого строка. Я хотел бы отметить, что когда LAG () используется в первой строке, он возвращает ноль. По этой причине используется фильтр WHEN prev_loc IS NOT NULL.

Вывод будет следующим:

enter image description here

Как видите, я выбрал employeeid для эффективной проверки результатов. Хотя вы можете удалить это поле из последнего оператора выбора и получить только те поля, которые вы sh.

Наконец, если вы хотите проверить, сколько раз сотрудник переместился, вам понадобится еще одна часть кода для запроса таблицы выше. Когда вы используете COUNT () , вы не можете получить старые и новые даты, как вы указали выше, потому что вы подсчитываете, сколько раз каждый сотрудник перемещался и группировался по employeeid . Это означает, что у вас будет число (число) на employeeid . Таким образом, в этом случае я сохранил вышеуказанный результат во временной таблице с именем final_output , чтобы запросить его следующим образом:

SELECT employeeid, count(employeeid) as MOVED FROM final_output
 GROUP BY employeeid

И вывод:

enter image description here

Работодатель с идентификатором 2467 переместился 4 раза за анализируемый период времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...