2011-12-19 68 views
1

我想從一個表中的一行來獲得最大和最小值如何獲得分鐘和列的最大rowcoun的每一行

例如,我在表中的以下行:

Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'A', 1210885); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AA', 1211091); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAAA', 9); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAAE', 1); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AABVF', 11); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AAC', 916); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACAY', 2); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACC', 2469); 
Insert into TABLE1 
    (TRADE_DATE, COL_NAME, COL_VALUE, REC_COUNT) 
Values 
    (TO_DATE('12/08/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'STOCK_SYM', 'AACOU', 66); 

我想得到的結果如下

col_val1 max_val  col_val2 min_val 
-------- -------  -------- ------ 
AA  1211091  AAAE  1 
A  1210885  AACAY  2 
AACC  2496  AAAA  9 
AAC  916   AABVF  11 
AACOU 66   AACOW  56 

我試圖min(col_value) over (partition by trade_date order by rec_count),但我只能得到任何最小或最大。當我創建兩個表,一個用min和另一個用max,並從中選擇,我得到一個笛卡兒連接。

+0

您的示例數據在「col_val」列中沒有任何重複值。實際數據中會有一天以上的AA嗎? – Morbo 2011-12-19 22:42:33

+0

在您的示例結果中,什麼是最大值和最小值?它是按日期嗎?您的示例輸入數據只有一個日期... – muratgu 2011-12-19 22:58:05

回答

2

我想你可能需要

select col_val, rec_count, 
     row_number over (partition by trade_date order by rec_count DESC) as HiLoRow 

的第2列在你的答案,然後

select col_val, rec_count, 
     row_number over (partition by trade_date order by rec_count) as LoHiRow 

下半年。 然後從這兩個選擇,嵌套和加入HiLoRow = LoHiRow

如果兩個col_vals具有相同的rec_count,則情況可能仍不理想。
名單也將是兩次只要你需要,所以你可能要像

where q1.rec_count >= q2.rec_count 

減少一半的長度。

3

這將返回結果預期。你應該注意到,如果有奇數個結果的最後一行將有col_val1相同的價值觀和col_val2

WITH data as ( 
    SELECT 
      row_number() over (order by rec_count desc) rn_desc, 
      row_number() over (order by rec_count asc) rn_asc, 
      trade_date, 
      COL_NAME, 
      col_value, 
      rec_count 

    FROM TAble1) 
SELECT 
    d1.col_value col_val1, 
    d1.rec_count max_val, 
    d2.col_value col_val2, 
    d2.rec_count min_val 
FROM 
    data d1 
    INNER JOIN data d2 
    ON d1.rn_desc = d2.rn_asc 
WHERE 
    d1.rn_desc <= (select CEIL(COUNT(*)/2) FROM data) 

您可以在此看到data.se query工作的例子。 (請注意,在翻譯成SQL Server語法方面存在一些細微差異,最顯着的是CEILING vs CEIL

相關問題