2014-10-01 1 views
1

경고 : PROC를 쓰거나 실행할 수있는 권한이 없으며 임시 테이블을 만들거나 수정할 수 없습니다.netezza sql : 파티션 내의 필드 값을 모두 비교하여 N이 가장 작은 레코드를 찾습니다.

GIVEN 'unique_primary_key', 'cust_num'및 'sale_date'필드가있는 다중 세트 테이블 'table1'. 'cust_num'의 각 고유 값에 대해 'sale_date'의 값이 다른 여러 레코드가 존재합니다.

필요 : 'cust_num'을 기준으로 파티셔닝 한 후 해당 레코드에 대한 'sale_date'와 파티션 내의 다른 모든 레코드에 대한 'sale_date'의 차이의 최소값을 찾으십시오. 또한 차이의 두 번째로 작은 값이고 세 번째 값은 가장 작습니다.

서로 다른 'cust_num'은 테이블에 3에서 75 개의 레코드 (모두 날짜가 다름)를 가지므로 파티션에서 'sale_date'로 주문하고 'sales_date'값을 다른 모든 레코드와 명시 적으로 비교하기 위해 진행합니다 파티션에서 가능하지 않습니다.

MATCH를 인수 등으로 사용하는 INDEX 함수를 사용하여 Excel에서 쉽게 수행하는 방법을 알고 있지만 SQL에서 비슷한 프로 시저를 알지 못합니다.

답변

0

날짜의 차이에 대한 전방 또는 후진 측정 만 원한다면 간단한 지연/납치 방식으로이 작업을 수행 할 수 있다고 생각합니다. 그런 다음

select * from table1 order by cust_num, sale_date; 
UNIQUE_PRIMARY_KEY | CUST_NUM | SALE_DATE 
--------------------+----------+------------ 
        7 |  1 | 2014-10-06 
        2 |  1 | 2014-10-12 
        5 |  1 | 2014-10-14 
        1 |  1 | 2014-10-17 
        4 |  1 | 2014-10-19 
        3 |  1 | 2014-10-22 
        6 |  1 | 2014-10-25 
      100008 |  5 | 2014-10-07 
      300002 |  5 | 2014-10-13 
      100006 |  5 | 2014-10-15 
      200003 |  5 | 2014-10-18 
      200004 |  5 | 2014-10-20 
      100005 |  5 | 2014-10-23 
      100007 |  5 | 2014-10-26 

은 ...

당신이 날짜 차이의 ABS로 지정할 가능성이 경우
SELECT UNIQUE_PRIMARY_KEY pk, 
    CUST_NUM, 
    SALE_DATE, 
    lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date) lead1, 
    lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date) lead2, 
    lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date) lead3 
FROM table1 
ORDER BY CUST_NUM, 
    SALE_DATE 

    PK | CUST_NUM | SALE_DATE | LEAD1 | LEAD2 | LEAD3 
--------+----------+------------+------------+------------+------------ 
     7 |  1 | 2014-10-06 | 2014-10-12 | 2014-10-14 | 2014-10-17 
     2 |  1 | 2014-10-12 | 2014-10-14 | 2014-10-17 | 2014-10-19 
     5 |  1 | 2014-10-14 | 2014-10-17 | 2014-10-19 | 2014-10-22 
     1 |  1 | 2014-10-17 | 2014-10-19 | 2014-10-22 | 2014-10-25 
     4 |  1 | 2014-10-19 | 2014-10-22 | 2014-10-25 | 
     3 |  1 | 2014-10-22 | 2014-10-25 |   | 
     6 |  1 | 2014-10-25 |   |   | 
100008 |  5 | 2014-10-07 | 2014-10-13 | 2014-10-15 | 2014-10-18 
300002 |  5 | 2014-10-13 | 2014-10-15 | 2014-10-18 | 2014-10-20 
100006 |  5 | 2014-10-15 | 2014-10-18 | 2014-10-20 | 2014-10-23 
200003 |  5 | 2014-10-18 | 2014-10-20 | 2014-10-23 | 2014-10-26 
200004 |  5 | 2014-10-20 | 2014-10-23 | 2014-10-26 | 
100005 |  5 | 2014-10-23 | 2014-10-26 |   | 
100007 |  5 | 2014-10-26 |   |   | 
(14 rows) 

, 내 머리는 여전히 지연 & 리드를 사용하고 싶어하지만, 이에 streatching한다 그 슬픈 용량이 같은 훨씬 더 복잡한 방식으로 그것을 함께 조각이 있습니다

WITH foo AS 
    (
     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 

     UNION ALL 

     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 

     UNION ALL 

     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 

     UNION ALL 

     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lag(sale_date,1) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lag(sale_date,1) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 

     UNION ALL 

     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lag(sale_date,2) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lag(sale_date,2) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 

     UNION ALL 

     SELECT UNIQUE_PRIMARY_KEY pk, 
     cust_num, 
     sale_date, 
     lag(sale_date,3) over (partition BY cust_num ORDER BY sale_date)     rel_sales_date, 
     ABS(sale_date - lag(sale_date,3) over (partition BY cust_num ORDER BY sale_date)) day_delta 
     FROM table1 
    ) 
SELECT pk, 
    cust_num, 
    sale_date, 
    rel_sales_date, 
    day_delta, 
    day_rank 
FROM (
     SELECT pk , 
     cust_num, 
     sale_date, 
     rel_sales_date, 
     day_delta, 
     dense_rank() over (partition BY pk ORDER BY day_delta nulls last) day_rank 
     FROM foo 
    ) 
    foob 
WHERE day_rank <= 3 
ORDER BY cust_num, 
    sale_date, 
    day_rank 


    PK | CUST_NUM | SALE_DATE | REL_SALES_DATE | DAY_DELTA | DAY_RANK 
--------+----------+------------+----------------+-----------+---------- 
     7 |  1 | 2014-10-06 | 2014-10-12  |   6 |  1 
     7 |  1 | 2014-10-06 | 2014-10-14  |   8 |  2 
     7 |  1 | 2014-10-06 | 2014-10-17  |  11 |  3 
     2 |  1 | 2014-10-12 | 2014-10-14  |   2 |  1 
     2 |  1 | 2014-10-12 | 2014-10-17  |   5 |  2 
     2 |  1 | 2014-10-12 | 2014-10-06  |   6 |  3 
     5 |  1 | 2014-10-14 | 2014-10-12  |   2 |  1 
     5 |  1 | 2014-10-14 | 2014-10-17  |   3 |  2 
     5 |  1 | 2014-10-14 | 2014-10-19  |   5 |  3 
     1 |  1 | 2014-10-17 | 2014-10-19  |   2 |  1 
     1 |  1 | 2014-10-17 | 2014-10-14  |   3 |  2 
     1 |  1 | 2014-10-17 | 2014-10-12  |   5 |  3 
     1 |  1 | 2014-10-17 | 2014-10-22  |   5 |  3 
     4 |  1 | 2014-10-19 | 2014-10-17  |   2 |  1 
     4 |  1 | 2014-10-19 | 2014-10-22  |   3 |  2 
     4 |  1 | 2014-10-19 | 2014-10-14  |   5 |  3 
     3 |  1 | 2014-10-22 | 2014-10-25  |   3 |  1 
     3 |  1 | 2014-10-22 | 2014-10-19  |   3 |  1 
     3 |  1 | 2014-10-22 | 2014-10-17  |   5 |  2 
     3 |  1 | 2014-10-22 | 2014-10-14  |   8 |  3 
     6 |  1 | 2014-10-25 | 2014-10-22  |   3 |  1 
     6 |  1 | 2014-10-25 | 2014-10-19  |   6 |  2 
     6 |  1 | 2014-10-25 | 2014-10-17  |   8 |  3 
100008 |  5 | 2014-10-07 | 2014-10-13  |   6 |  1 
100008 |  5 | 2014-10-07 | 2014-10-15  |   8 |  2 
100008 |  5 | 2014-10-07 | 2014-10-18  |  11 |  3 
300002 |  5 | 2014-10-13 | 2014-10-15  |   2 |  1 
300002 |  5 | 2014-10-13 | 2014-10-18  |   5 |  2 
300002 |  5 | 2014-10-13 | 2014-10-07  |   6 |  3 
100006 |  5 | 2014-10-15 | 2014-10-13  |   2 |  1 
100006 |  5 | 2014-10-15 | 2014-10-18  |   3 |  2 
100006 |  5 | 2014-10-15 | 2014-10-20  |   5 |  3 
200003 |  5 | 2014-10-18 | 2014-10-20  |   2 |  1 
200003 |  5 | 2014-10-18 | 2014-10-15  |   3 |  2 
200003 |  5 | 2014-10-18 | 2014-10-13  |   5 |  3 
200003 |  5 | 2014-10-18 | 2014-10-23  |   5 |  3 
200004 |  5 | 2014-10-20 | 2014-10-18  |   2 |  1 
200004 |  5 | 2014-10-20 | 2014-10-23  |   3 |  2 
200004 |  5 | 2014-10-20 | 2014-10-15  |   5 |  3 
100005 |  5 | 2014-10-23 | 2014-10-20  |   3 |  1 
100005 |  5 | 2014-10-23 | 2014-10-26  |   3 |  1 
100005 |  5 | 2014-10-23 | 2014-10-18  |   5 |  2 
100005 |  5 | 2014-10-23 | 2014-10-15  |   8 |  3 
100007 |  5 | 2014-10-26 | 2014-10-23  |   3 |  1 
100007 |  5 | 2014-10-26 | 2014-10-20  |   6 |  2 
100007 |  5 | 2014-10-26 | 2014-10-18  |   8 |  3 
(46 rows) 

희망하는 데 도움이, 그렇지 않은 경우 나는 적어도 이번 금요일 약간 정신 운동을 얻었다 오후.