2009-05-13 5 views
1

파이썬 응용 프로그램이 있습니다. 그것은 SQLite 데이터베이스를 가지고 있으며, 웹에서 스크랩하는 사람이 검색 한 일들에 대한 데이터가 가득합니다. 이 데이터에는 Unix 타임 스탬프와 같은 시간 날짜 그룹이 포함되어 있습니다. 나는 일을 한 조직의 이름을 검색하고 얼마나 자주했는지를 계산하고 싶지만 매주 (즉, 604,800 초)이 일을하기 위해 데이터를 가지고 있습니다.필드 값의 모든 증가분에 대해 GROUP BY는 어떻게합니까?

의사 코드 :

for each 604800-second increment in time: 
select count(time), org from table group by org 

기본적으로 제가 목표는 604800.하는 단계 값, 시간 열을 정렬 된 목록과 같은 데이터베이스를 통해 반복되는 할 노력하고있어 어떻게 분포를 분석하는 시간이 지남에 따라 변화하는 전체 조직의 수를 나타냅니다.

가능하면 DB에서 모든 행을 가져 오지 않고 파이썬에서 처리하는 것을 피하고 싶습니다. 데이터가 데이터베이스에있는 경우 비효율적이며 비효율적입니다.

답변

1
나는 그것이 weeknumber을 찾아 오프셋

오라클에서
SELECT org, ROUND(time/604800) - week_offset, COUNT(*) 
FROM table 
GROUP BY org, ROUND(time/604800) - week_offset 

시간이 날짜 열 있다면 나는 다음을 사용 차감이 방법은 대부분의 데이터베이스에 대한 작업을해야한다고 생각 SQLite는 잘 알고있는하지

:

SELECT org, TO_CHAR(time, 'YYYY-IW'), COUNT(*) 
FROM table 
GROUP BY org, TO_CHAR(time, 'YYYY-IW') 

SQLite는 눈에 쉽게 들어오는 이런 종류의 SELECT 기능을 제공합니다.

+0

예. strftime 함수를 사용하여 날짜 - 시간 문자열 (및 시작하는 경우 unixepoch 수정 자)을 포맷 할 수 있으며 유닉스 - 획 숫자를 잘라내는 간단한 방법을 사용할 수 있습니다. –

+0

감사! 이것이 해결책이다. TO_CHAR은 sqlite에는 존재하지 않지만 strftime 함수가 수행하므로이 방법으로 정렬 할 수있었습니다. – user106514

1

신기원 이후로 모든 주를 나열하는 표를 만들고 이벤트 표에 JOIN 표를 작성하십시오.

CREATE TABLE Weeks (
    week INTEGER PRIMARY KEY 
); 

INSERT INTO Weeks (week) VALUES (200919); -- e.g. this week 

SELECT w.week, e.org, COUNT(*) 
FROM Events e JOIN Weeks w ON (w.week = strftime('%Y%W', e.time)) 
GROUP BY w.week, e.org; 

연간 52-53 주입니다. Weeks 테이블을 100 년 동안 채우더라도 여전히 작은 테이블입니다.

1

집합 기반 방식 (SQL의 장점)으로이 작업을 수행하려면 시간 증가분을 기준으로 집합 기반의 표현이 필요합니다. 임시 테이블, 영구 테이블 또는 파생 테이블 (예 : 하위 쿼리) 일 수 있습니다. 나는 SQLite에 너무 익숙하지 않고 유닉스에서 일한 이후로 잠시 있었다. UNIX의 타임 스탬프는 날짜/시간 설정 이후 # 초입니다. (데이터베이스에있는 것이 유용하다) 표준 달력 테이블을 ... 사용

SELECT 
    C1.start_time, 
    C2.end_time, 
    T.org, 
    COUNT(time) 
FROM 
    Calendar C1 
INNER JOIN Calendar C2 ON 
    C2.start_time = DATEADD(dy, 6, C1.start_time) 
INNER JOIN My_Table T ON 
    T.time BETWEEN C1.start_time AND C2.end_time -- You'll need to convert to timestamp here 
WHERE 
    DATEPART(dw, C1.start_time) = 1 AND -- Basically, only get dates that are a Sunday or whatever other day starts your intervals 
    C1.start_time BETWEEN @start_range_date AND @end_range_date -- Period for which you're running the report 
GROUP BY 
    C1.start_time, 
    C2.end_time, 
    T.org 

달력 표는 당신이 원하는 어떤 형태 걸릴 수 있으므로 당신이 START_TIME 및 END_TIME 위해에서 UNIX 타임 스탬프를 사용할 수 있습니다. 생각해 볼 수있는 모든 날짜로 미리 채우기 만하면됩니다. 1900-01-01에서 9999-12-31로 넘어가더라도 대단히 큰 테이블은 아닙니다. 많은보고 유형 쿼리에 유용 할 수 있습니다.

마지막으로이 코드는 T-SQL이므로 DATEPART와 DATEADD를 SQLite의 해당 항목으로 변환해야 할 수 있습니다.

관련 문제