Псевдоним Ссылка Date_Diff Days. Нужно разобрать или создать временную таблицу с датами? - PullRequest
0 голосов
/ 20 февраля 2020

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

Table1

EmployeeID | StartDateTimestamp | CohortID | CohortName
---------- | ------------------ | -------- | ----------
1          | 20080101 01:30:00  | 1        | Peanut
1          | 20090204 01:01:00  | 2        | Apple
2          | 20190107 05:52:14  | 1        | Peanut
3          | 20190311 02:35:26  | 2        | Apple

Сотрудник

EmployeeID | HireStartName | StartDateTimestamp2
---------- | ------------- | -------------------
1          | HiredStart    | 20080501 01:30:00
1          | DeferredStart | 20090604 01:01:00
2          | HiredStart    | 20190115 05:52:14
3          | HiredStart    | 20190330 02:35:26

Запрос

select 
    t.cohortid, 
    min(e.startdatetimestamp2) first,  
    max(e.startdatetimestamp2) last

from table1 t
inner join employee e on e.employeeid = t.employeeid
group by t.cohort_id

Выходные данные

ID | FIRST            | LAST
1  |20190106 12:00:05 |20180214 03:45:12
2  |20180230 01:45:23 |20180315 01:45:23

Моя попытка:

SELECT DATE_DIFF(first, last, Day), ID, max(datecolumn1) first, min(datecolumn1) last

Ошибка: нераспознанное имя. Как ввести псевдоним ссылки первым и последним в Date_Diff? Нужно ли выводить таблицу?

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

Этот ответ обсуждался здесь: Разница в дате между последовательными строками

DateDiff устарел, и теперь это Date_Diff (первый, последний, день)

Затем я попытался:

SELECT ID, DATE_DIFF(PARSE_DATE('%y%m%d',t.first), PARSE_DATE('%y%m%d',t.last), DAY) days
FROM table

Не удалось проанализировать входную строку "20180125 01:00:05"

Попробовал

SELECT CohortID, date_diff(first,last,day) as days
FROM (select cohortid,min(startdatetimestamp2) first, 
max(startdatetimestamp2) last 
FROM employee 
JOIN table1 on table1.employeeid = employee.employeeid 
group by cohortid)

Я получаю дни, не найденные ни сторона соединения

1 Ответ

0 голосов
/ 20 февраля 2020

Что касается вашего первого вопроса об использовании псевдонимов в запросе, есть некоторые ограничения, где их использовать, особенно в ОТ , GROUP BY и ORDER BY заявления. Я рекомендую вам посмотреть здесь , чтобы проверить эти ограничения.

О вашей основной проблеме - получении разницы между двумя датами. Я хотел бы отметить, что ваши метки времени в обеих ваших таблицах в BigQuery рассматриваются как формат DATETIME . Поэтому для получения желаемых результатов вы должны использовать встроенные функции DATETIME .

В приведенном ниже запросе используются предоставленные вами данные для получения целевого вывода.

WITH
  data AS 
  (
  SELECT
    t.cohortid AS ID,
    PARSE_DATETIME('%Y%m%d %H:%M:%S', MIN(e.startdatetimestamp2)) AS first,
    PARSE_DATETIME('%Y%m%d %H:%M:%S', MAX(e.startdatetimestamp2)) AS last
  FROM
    `test-proj-261014.sample.table1` t
  INNER JOIN
    `test-proj-261014.sample.employee` e
  ON
    e.employeeid = t.employeeid
  GROUP BY t.cohortid 
  )
SELECT
  ID,
  first,
  last,
  DATETIME_DIFF(last, first, DAY ) AS diff_days
FROM
  data

И вывод:

enter image description here

Обратите внимание, что я создал временную таблицу для форматирования полей StartDateTimestamp и StartDateTimestamp2 , используя PARSE_DATETIME () . После этого я использовал метод DATETIME_DIFF () , чтобы получить разницу в днях между двумя полями.

Надеюсь, это поможет.

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