【问题标题】:how to get min and max rowcoun of a column for every row如何获取每一行的列的最小和最大行数
【发布时间】:2011-12-19 22:24:03
【问题描述】:

我想从一张表的一行中获取最大值和最小值

例如,我在表 a 中有以下行:

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),但我只能得到最小值或最大值。当我创建两个表时,一个带有最小值,另一个带有最大值,并从中进行选择,我得到一个笛卡尔连接。

【问题讨论】:

  • 您的样本数据在“col_val”列中没有任何重复值。一天的真实数据中会不会有不止一个AA?
  • 在您的示例结果中,最大值和最小值是什么?是按日期吗?您的示例输入数据只有一个日期...

标签: sql oracle plsql


【解决方案1】:

这将返回预期的结果。您应该注意,如果结果数为奇数,则底行 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 语法方面存在一些细微差别,最明显的是 CEILINGCEIL

【讨论】:

    【解决方案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_val 具有相同的 rec_count,情况可能仍然不理想。
    该列表也将是您需要的两倍,因此您可能需要类似

    where q1.rec_count >= q2.rec_count
    

    将长度减半。

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2023-03-07
      • 2020-03-19
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多