【问题标题】:SQL - selecting min value and returning all column information for that minSQL - 选择最小值并返回该最小值的所有列信息
【发布时间】:2015-09-16 14:37:40
【问题描述】:

我正在使用 SQL Server 2014 Management Studio

为了完整,我将显示完整的查询:

SELECT 
    final_eqid.eqId, eqPrice.date_, 
    optContract.expDate, optContract.strike,
    MIN(ivListed.ivMid) iv
FROM final_eqid 
    INNER JOIN eqPrice ON final_eqid.eqId = eqPrice.eqId 
    INNER JOIN optContract ON eqPrice.eqId = optContract.eqId 
    INNER JOIN ivListed ON eqPrice.date_ = ivListed.date_ 
        AND optContract.optId = ivListed.optId
WHERE 
    eqPrice.date_ = '2008-01-02' 
    AND final_eqid.eqid = 7
GROUP BY final_eqid.eqid, eqPrice.date_, optContract.expDate, optContract.strike

我故意只选择了一个 date_ 和一个 eqid,但我每个都有数千个。

结果如下:

 eqId   date_                expDate           strike   iv
    7   2008-01-02 00:00:00 2008-01-19 00:00:00 25.000  0.9319
    7   2008-01-02 00:00:00 2008-02-16 00:00:00 25.000  0.6306
    7   2008-01-02 00:00:00 2008-05-17 00:00:00 25.000  0.5349
    7   2008-01-02 00:00:00 2008-08-16 00:00:00 25.000  0.5006
    7   2008-01-02 00:00:00 2008-01-19 00:00:00 30.000  0.5727
    7   2008-01-02 00:00:00 2008-02-16 00:00:00 30.000  0.5083
    7   2008-01-02 00:00:00 2008-05-17 00:00:00 30.000  0.2752
    7   2008-01-02 00:00:00 2008-08-16 00:00:00 30.000  0.4559
    7   2008-01-02 00:00:00 2008-01-19 00:00:00 35.000  0.3854
    7   2008-01-02 00:00:00 2008-02-16 00:00:00 35.000  0.4065
    7   2008-01-02 00:00:00 2008-05-17 00:00:00 35.000  0.4308
    7   2008-01-02 00:00:00 2008-08-16 00:00:00 35.000  0.4213
    7   2008-01-02 00:00:00 2008-01-19 00:00:00 40.000  0.3472
    7   2008-01-02 00:00:00 2008-02-16 00:00:00 40.000  0.37
    7   2008-01-02 00:00:00 2008-05-17 00:00:00 40.000  0.3969
    7   2008-01-02 00:00:00 2008-08-16 00:00:00 40.000  0.3953

我想要获得的是 min iv 罢工以及该行的所有其他信息。在上述数据中,理想情况下会返回

eqId    date_   expDate strike  iv
7   1/2/2008    1/19/2008   40  0.3472
7   1/2/2008    2/16/2008   40  0.37
7   1/2/2008    5/17/2008   30  0.2752
7   1/2/2008    8/16/2008   40  0.3953

如果我不按罢工分组,那么我会得到正确的数字,但无法识别具有 min(iv) 值的罢工

提前感谢您的任何帮助

【问题讨论】:

  • 你可以试试ROW_NUMBER。

标签: sql-server group-by min


【解决方案1】:

我认为您想要的是使用Common Table Expression (CTE),它指定您可以查询的临时结果集。 MIN 函数与 OVER 子句一起使用,将 FROM 子句生成的结果集划分为应用该函数的分区。

这是一个基于您的查询的示例(虽然我还没有测试过,所以请注意):

WITH cteData AS
(
    SELECT final_eqid.eqId, 
           eqPrice.date_, 
           optContract.expDate, 
           optContract.strike,  
           ivListed.ivMid iv, 
           MIN(ivListed.ivMid) OVER (PARTITION BY final_eqid.eqId, eqPrice.date_,optContract.expDate) as MinIV
    FROM   final_eqid INNER JOIN
                 eqPrice ON final_eqid.eqId = eqPrice.eqId INNER JOIN
                 optContract ON eqPrice.eqId = optContract.eqId INNER JOIN
                 ivListed ON eqPrice.date_ = ivListed.date_ AND optContract.optId = ivListed.optId
    WHERE eqPrice.date_ ='2008-01-02' and final_eqid.eqid=7
    GROUP BY final_eqid.eqid, eqPrice.date_, optContract.expDate, optContract.strike, ivListed.ivMid
)
select eqId, date_, expDate, strike, iv
from cteData
where cteData.iv=cteData.MinIV

【讨论】:

  • 我相信我纠正了你提到的两个错误。对于第二个,MIN(ivListed.isMid) 应该是简单的ivListed.ivMid 并包含在GROUP BY 子句中。如果描述不够清楚,请检查编辑历史记录以查看具体更改:)
  • 有什么建议可以避免我的 tempdb.mdf 文件增长到超过 600 gigs 并因为磁盘空间问题而导致崩溃?
  • 您期望有多少行数据?您可以尝试使用 SELECT INTO 临时/工作表,而不是使用相同查询的 CTE。
  • 我尝试在建议的代码中选择进入,但发生了同样的事情,但我同时拥有 CTE 和选择进入。也就是说,我首先尝试了 CTE。我不确定如何在没有 CTE 的情况下实现这一点。我能麻烦您提供选择进入选项吗?非常感谢 :-) 顺便说一句,大约 800 万行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2012-12-15
  • 1970-01-01
  • 2021-08-14
  • 2019-08-05
  • 2018-08-27
  • 2014-03-24
相关资源
最近更新 更多