2011-12-19 70 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

相关问题