2014-10-28 3 views
0

그래서 나는이처럼 보이는 테이블이 :카운트

Person  Product  Date   Quantity 
1   A  1/11/2014  1 
2   A  1/11/2014  2 
1   A  1/20/2014  2 
3   A  1/21/2014  1 
3   B  1/21/2014  1 
1   A  1/25/2014  1 

나는 제품이 어디 수량의 개수를 찾기 위해 원하는 사람이 어떤 내 백작> 1 있다 30 일을 SLAYING 범위. 또 다른 핵심은 두 개의 레코드가 기준을 충족하면 다시 계산에 추가하지 않아야한다는 것입니다. 예를 들어, 사람 1은 1/11 및 1/20에 대해 3의 수를 가지지 만 1/20 및 1/25에 대해서는 3의 수를 갖지 않습니다. 사람 2의 개수는 2입니다. 두 번째 제품이 B이기 때문에 사람 3이 결과에 표시되지 않습니다.이 쿼리는 특정 날짜 범위 내에서 실행됩니다 (예 : 2014 년 1 월 1 일부터 10 월 27 일까지).).

내 제품은 MySQL과 PHP로 작성되었으며, MySQL에서 독점적으로 사용하고 싶습니다. 그러나 이것은 OLAP 문제와 유사합니다. 나는 어떤지도라도 크게 감사한다.

+0

시도한 것을 공유 할 수 있습니까? –

+0

MySQL에서이 작업을 독점적으로 시작할 위치조차 모르겠습니다. 범위 내에서 매 30 일 동안 PHP에서 중첩 루프를 수행하고 콜렉션을 빌드 할 수 있습니다. 그것은 꽤 짐승이다. – kakridge

+0

항상 저장 프로 시저를 만들 수 있습니다. –

답변

0

또 다른 핵심은 두 개의 레코드가 기준을 충족하면 다시 카운트에 추가하지 않아야한다는 것입니다.

이것은 관계형이 아닙니다. 이것이 의미가 있기 위해서는 레코드가 평가되는 순서를 정의해야합니다. SQL에는 ORDER BY이 있지만 표시 목적으로 만 사용됩니다. 조회가 계산되는 순서에는 영향을주지 않습니다. 평가 순서는 중요하지 않습니다.

나는 이것이 SELECT 쿼리로 전혀 표현 될 수 없다고 생각합니다. 내가 맞다면 plSQL 또는 비 SQL 언어로 남겨 둡니다.

이 요구 사항을 삭제하려는 경우 (그리고 후 처리 과정에서이를 구현하는 경우, 아래 참조),이 작업을 수행 할 수 있습니다. 모든 관련 날짜 범위의 뷰 시작 :

CREATE VIEW date_ranges(
    start_date, -- DATE 
    end_date -- DATE 
) AS 
SELECT DISTINCT date, DATE_ADD(date, INTERVAL 30 day) 
FROM your_table; 

을 이제, 관련 카운트의 뷰 생성 : 사후 처리에 대한

CREATE VIEW product_counts(
    person, -- INTEGER REFERENCES your_table(person) 
    count, -- INTEGER 
    start_date, -- DATE 
    end_date -- DATE 
) AS 
SELECT y.person, 
    sum(y.quantity), 
    r.start_date, 
    r.end_date 
FROM date_ranges r 
JOIN your_table y 
ON y.date BETWEEN r.start_date AND r.end_date 
GROUP BY y.person 
HAVING sum(y.quantity) > 1; 

을, 당신은 product_counts보기의 각 행을 볼 필요가 그것에 해당하는 구매 주문 (행은 your_table)을 찾아보십시오. (해시 세트를 사용하여) 이전에 해당 주문을 본 적이 있는지 확인하십시오. 그렇다면 해시 세트를 고려하지 말고 현재 항목 수를 줄이고 완전히 제거하십시오. 이것은 SQL 이외의 절차 언어로 수행하는 것이 가장 좋습니다.

+0

동의. 나는 관계형 솔루션을 원했지만 당신이 옳다고 믿습니다. – kakridge