2017-10-11 1 views
2

내가 같이 데이터베이스에 몇 가지 필드가 END_DATE 방법 :SQL - 시작일을 사용하여 활동 일 누락을 발견하고

trip_id 

start_date 
end_date 

start_station_name 
end_station_name 

난에 활동 모든 방송국을 표시하는 쿼리를 작성해야을 2015 년의 특정 일 나는 다음과 같은 쿼리를 작성하지만 오른쪽 출력 포기하지 않을 것 :

select 
    start_station_name, 
    extract(date from start_date) as dt, 
    count(*) 
from 
    trips_table 
where 
    (
     start_date >= timestamp('2015-01-01') 
     and 
     start_date < timestamp('2016-01-01') 
    ) 
group by 
    start_station_name, 
    dt 
order by 
    count(*) 

사람이 올바른 쿼리 올 도움이 될 수

를? 미리 감사드립니다! 이 목적을 위해

+0

아래와 같다? – Strawberry

+1

왜 MySQL 태그입니까? – Strawberry

+0

mysql 태그를 제거했습니다. 나는 google-bigquery에 그것을 써야한다. end_date는 start_date와 같은 방식으로 작동합니다. 따라서 둘 중 하나에 활동이 있으면 그 날에는 계산하지 않습니다. –

답변

1


또한 가정입니다 ....이 당신을 도울 것이라고 생각 시작일과 종료일 사이의 모든 일 가장 가능성이 예상되는없는 어떤 그러나 문제는 PL/당신은 테스트 할 수 있습니다 이러한 가정을 따라서 여기

#standardSQL 
WITH days AS (
    SELECT day 
    FROM UNNEST(GENERATE_DATE_ARRAY('2015-01-01', '2015-12-31')) AS day 
), 
stations AS (
    SELECT DISTINCT start_station_name AS station 
    FROM `trips_table` 
) 
SELECT s.* 
FROM (SELECT * FROM stations CROSS JOIN days) AS s 
LEFT JOIN (SELECT * FROM `trips_table`, 
      UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) AS day) AS a 
ON s.day = a.day AND s.station = a.start_station_name 
WHERE a.day IS NULL 

을 세부 사항이 누락되어 start_station_name 분야에서 역은 "전용"입니다 심플/더미 데이터

아래로 그것을 바깥
#standardSQL 
WITH `trips_table` AS (
    SELECT 1 AS trip_id, DATE '2015-01-01' AS start_date, DATE '2015-12-01' AS end_date, '111' AS start_station_name UNION ALL 
    SELECT 2, DATE '2015-12-10', DATE '2015-12-31', '111' 
), 
days AS (
    SELECT day 
    FROM UNNEST(GENERATE_DATE_ARRAY('2015-01-01', '2015-12-31')) AS day 
), 
stations AS (
    SELECT DISTINCT start_station_name AS station 
    FROM `trips_table` 
) 
SELECT s.* 
FROM (SELECT * FROM stations CROSS JOIN days) AS s 
LEFT JOIN (SELECT * FROM `trips_table`, 
      UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) AS day) AS a 
ON s.day = a.day AND s.station = a.start_station_name 
WHERE a.day IS NULL 
ORDER BY station, day 

출력이란 종료일 약

station day 
111  2015-12-02 
111  2015-12-03 
111  2015-12-04 
111  2015-12-05 
111  2015-12-06 
111  2015-12-07 
111  2015-12-08 
111  2015-12-09 
0

사용 재귀이 바이올린을 참조 MySQL 용

WITH sample AS (
    SELECT CAST('2015-01-01' AS DATETIME) AS dt 
    UNION ALL 
    SELECT DATEADD(dd, 1, dt) 
    FROM sample s 
    WHERE DATEADD(dd, 1, dt) < CAST('2016-01-01' AS DATETIME) 
) 
SELECT * FROM sample 
left join tablename 
on CAST(sample.dt as date) = CAST(tablename.start_date as date) 
where sample.dt>= '2015-01-01 00:00:00' and sample.dt< '2016-01-01 00:00:00') 
Option(maxrecursion 0) 

: 시도 당신이 그것으로 역 데이터를 원하는 경우

WITH sample AS (
    SELECT CAST('2015-01-01' AS DATETIME) AS dt 
    UNION ALL 
    SELECT DATEADD(dd, 1, dt) 
    FROM sample s 
    WHERE DATEADD(dd, 1, dt) < CAST('2016-01-01' AS DATETIME) 
) 
SELECT * FROM sample 
Where CAST(sample.dt as date) NOT IN (
    SELECT CAST(start_date as date) 
    FROM tablename 
    WHERE start_date >= '2015-01-01 00:00:00' 
    AND start_date < '2016-01-01 00:00:00' 
) 
Option(maxrecursion 0) 

는 다음 사용할 수있는이 SQL 서버는 왼쪽으로 가입 . 나는 BigQuery에 표준 SQL이

그것은 시작일과 종료일은 DATE 타입입니다 가정 아래를 SQL Fiddle Demo

+0

Google bigquery가이 구문을 지원한다고 생각하지 않습니다. – trincot

+0

죄송합니다. 내 잘못 이었으므로 태그에 mysql을 넣지 않아야합니다. –

관련 문제