【问题标题】:SQL query with calculated dynamic min max具有计算的动态最小值最大值的 SQL 查询
【发布时间】:2011-12-01 22:01:57
【问题描述】:

我遇到了一个 sql 问题。我有两张表,如下所示:

first TABLE X    second TABLE Y

TabX_ID|  DATE | Value Z    TabY_ID|TabX_ID | DATE | Value X | Value Y
4711   | 15.01 |    12         1   | 4711   | 15.01|  123    |  876
4711   | 20.01 |    5          2   | 4711   | 16.01|  12     |  54
4711   | 25.01 |    67         3   | 4711   | 17.01|  23     |  38
                               4   | 4711   | 20.01|  56     |  13
                               5   | 4711   | 23.01|  1      |  5

我需要将 TABLE Y 中的所有数据与 TABLE X DATE 中的数据关联到拟合 时间范围。

我不能使用简单的最小值 - 最大值,因为它会发生变化。

1. DATE min 15.01 DATE-max:19.01
2. DATE-min:20.01 DATE-max:24.01
3. DATE-min:25.01 DATE-max:... 

所以它看起来像这样

                     1 | 15.01 | 123 | 876
4711 | 15.01 | 12 -> 2 | 16.01 | 12  | 54    
                     3 | 17.01 | 23  | 38     

4711 | 20.01 | 5   -> 4 | 20.01 | 56  | 13
                      5 | 23.01 | 1   | 5

首先我需要使用 TABLE Y VALUES X 和 Y 执行计算,然后我需要 VALUE Z 来自表 X。所以它看起来像这样:

 ID  | DATE  | Calculated_Val
 4711| 15.01 | 345
 4711| 20.01 | 892

有没有办法做到这一点?

提前谢谢

【问题讨论】:

    标签: mysql sql oracle hive


    【解决方案1】:

    不确定 MySQL,但如果您使用 Oracle 执行此操作,我会使用 LEAD analytic function 在 tableX 中获取未来的下一个日期值,然后将其连接到 tableY。

    这方面的一个例子是:

    select
      tabX_id,
      date_val as min_date,
      next_date_val as max_date,
      valueZ,
      valueX,
      valueY,
      y.date_val as tabY_date
    from (
      select
        tabX_id,
        date_val,
        lead(date_val) over (partition by tabx_id order by date_val) 
          as next_date_val,
        valueZ
      from tabX
    ) x
    join tabY y on (x.tabX_id = y.tabX_id and 
                    y.date_val >= x.date_val and 
                    (x._next_date_val is null or y.date_val < x.next_date_val))
    

    请注意,我没有修改日期的下一个值,所以我使用小于条件。如果您在任何日期字段中都有时间组件,这可能是合适的,但如果它们只是日期值,则可能不是您想要的。

    【讨论】:

      【解决方案2】:

      这是一个简单的加入和分组:

       select x.TabX_ID, y.DATE, min(ValueX), min(ValueY)
       from TableX x
        join TableY y
          on x.TabX_ID = y.TabX_ID
         and x.DATE = y.DATE
       group by x.TabX_ID, y.DATE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        相关资源
        最近更新 更多