2014-10-01 16 views
1

注意事項:無權寫入/運行PROC,也不能創建/修改臨時表。netezza sql:比較分區內某個字段的所有值,找到N個最小差異的記錄

給出字段'unique_primary_key','cust_num'和'sale_date'的multiset表'table1'。 對於'cust_num'的每個不同值存在多個記錄,具有不同的'sale_date'值。

我需要:在'cust_num'分區之後,找到有關記錄的'sale_date'和分區內每個其他記錄的'sale_date'之間的差值的最小值。此外,該差異的第二小值,以及第三小的值。

每個不同的'cust_num'在表中有3到75條記錄(全部有不同的日期),因此只需在分區內按'sale_date'進行排序,然後繼續顯式比較'sale_date'值和其他所有記錄在分區中不可行。

我知道如何在Excel中使用帶MATCH的INDEX函數作爲參數之一輕鬆完成此操作等,但我不知道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更可能的情況下,我的大腦仍然希望使用滯後&領先,但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) 

希望幫助,如果沒有我至少得到了一些腦力鍛鍊這個星期五 下午。

相關問題