【问题标题】:SQL Server : selecting min value and returning all column information for that min without using CTESQL Server:选择最小值并返回该最小值的所有列信息而不使用 CTE
【发布时间】:2015-07-03 12:40:23
【问题描述】:

我有一个之前的问题得到了回答,但是当应用答案时,我的 tempdb.mdf 文件膨胀到超过 500 个演出。我正在使用一个大型数据库,但不是那么大(所有表的总数约为 800 gigs)。

为了减小大小,我将日期缩小到 1 个表(避免连接)。

这是我的查询:

SELECT
       cast ([date_] as date) date_
      ,cast ([expDate] as date) expDate
      ,[strike]
      ,[putCall]
      ,[eqId]
      ,[ivMid] iv
      ,[delta]
      ,[close_],
      MIN(ivMid) OVER (Partition by eqid, date_, expDate) as MinIV
FROM 
    [CRC].[dbo].[***minsmall]
GROUP BY 
    date_, expDate, strike, putCall, eqid, ivMid, delta, close_

它几乎让我到达了我想要的位置,只是我没有得到带有 min (iv) 的特定单行,而是将 min(iv) 作为列添加到所有行。

这是一个小样本:

date_    expDate       strike  putCall  eqId  iv   delta    close_      MinIV
2008-01-02  2008-01-19  25.000   C    7   0.9853    0.9788  37.380005   0.3472
2008-01-02  2008-01-19  25.000   P    7   0.9319    -0.0171 37.380005   0.3472
2008-01-02  2008-01-19  30.000   C    7   0.5727    0.9697  37.380005   0.3472
2008-01-02  2008-01-19  30.000   P    7   0.6316    -0.0451 37.380005   0.3472
2008-01-02  2008-01-19  35.000   C    7   0.3854    0.8062  37.380005   0.3472
2008-01-02  2008-01-19  35.000   P    7   0.4022    -0.2087 37.380005   0.3472
2008-01-02  2008-01-19  40.000   C    7   0.3472    0.199   37.380005   0.3472
2008-01-02  2008-01-19  40.000   P    7   0.366    -0.7918  37.380005   0.3472
2008-01-02  2008-02-16  25.000   C    7   0.6306    0.9752  37.380005   0.37
2008-01-02  2008-02-16  25.000   P    7   0.6463    -0.0281 37.380005   0.37
2008-01-02  2008-02-16  30.000   C    7   0.5146    0.9097  37.380005   0.37
2008-01-02  2008-02-16  30.000   P    7   0.5083    -0.0897 37.380005   0.37
2008-01-02  2008-02-16  35.000   C    7   0.4065    0.7136  37.380005   0.37
2008-01-02  2008-02-16  35.000   P    7   0.4127    -0.2923 37.380005   0.37
2008-01-02  2008-02-16  40.000   C    7   0.3801    0.3401  37.380005   0.37
2008-01-02  2008-02-16  40.000   P    7    0.37    -0.6735  37.380005   0.37

我想要的是简单地提取这一行:

2008-01-02  2008-01-19  40.000   C    7   0.3472    0.199   37.380005   0.3472

对于每个给定的“eqid, date_, expDate”组

我尝试添加这个语句:

where ivMid = MinIV

在 group by 语句上方,但我收到一条错误消息

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案1】:

    使用子查询:

    SELECT t.*
    FROM (SELECT cast([date_] as date) as date_, cast ([expDate] as date) as expDate,
                 [strike], [putCall], [eqId], [ivMid] as iv, [delta], [close_],
                 MIN(ivMid) OVER (Partition by eqid, date_, expDate) as MinIV
          FROM [CRC].[dbo].[***minsmall]
          GROUP BY date_, expDate, strike, putCall, eqid, ivMid, delta, close_
         ) t
    WHERE iv = minIV;
    

    您不能在WHERE 子句中为SELECT 使用在SELECT 中定义的列别名。

    【讨论】:

    • 非常感谢。有一点,我不得不将“where ivMid = minIV”更改为“where iv=minIV'以避免出现错误......我试图改变答案,但我得到一个“更改必须至少为 6 个字符”如果你可以改变,然后我会接受答案...... . .
    • @John 。 . .是的,我看到您在SELECT 中更改了该列的名称。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多