【问题标题】:returning only one row for each value of a column along with other values in different columns只为一列的每个值返回一行以及不同列中的其他值
【发布时间】:2014-10-08 10:22:53
【问题描述】:

我正在对一个 SQL 表进行查询,该表具有几列以及几行数据,并且该查询根据查询中给出的条件为每个唯一的第一列和第二列返回一行。

例如我有下表CC

product  term   bid  offer bidcp offercp
AA       sep14  20    10    x   y
AA       Sep14  15     9    p   q  
BA       Sep14  30    15    as  ps
XY       Sep14  25    15    r   t
XY       Oct14   30   20    t    r
XY       Oct14   25   22    p   q

当我对上表运行查询时,它应该返回以下数据

product  term   bid  offer bidcp offercp
AA       sep14  20    9      x   q(coming from a record which has lowest offer) 
BA       Sep14  30    15      as  ps
XY       Sep14  25    15      r   t
XY       Oct14  30    20      t    r

当我执行以下查询时,它甚至通过bidcp 和offercp 将CC 中的数据分组并返回几乎所有行,因为offercpbidcp 在一种或另一种方式中都是唯一的,但我只是想要@ 987654327@ 和 offercpbidoffer 的来源,假设 bidoffer 对每个产品和术语都是唯一的

select product,term,max(bid) as bid,min(offer) as offer,bidcp,offercp from canadiancrudes where product like '%/%' group by product,term,bidcp,offercp 

但是,当我从 groupby 子句中删除 bidcp 和 offercp 时,它给了我一个明显的错误

Column 'CC.BidCP' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

有没有更好的解决方法?

【问题讨论】:

  • 这张表上是否有标识或主键?您使用的是什么版本的 SQL Server?
  • 您的结果似乎表明对productterm 进行分组就足够了。选择分组中的其他 2 列是否有业务逻辑原因?
  • 如果某一行的出价较高,而另一行的出价较低怎么办?
  • @AHiggins 我正在使用 SQL Server 2012,并且我在该表上有一个主键
  • @shree.pat18 是的,按产品和术语分组就我而言就足够了,但最后看看我的问题

标签: sql sql-server sql-server-2012 aggregate-functions


【解决方案1】:

在这种情况下,您需要 2 个 CTE:

WITH o AS (
      SELECT product,term,offer,offercp, ROW_NUMBER() OVER (PARTITION BY product, term ORDER BY offer ASC) AS rn
      FROM  canadiancrudes where product like '%/%'
)
,   b AS (
      SELECT product,term,bid,bidcp, ROW_NUMBER() OVER (PARTITION BY product, term ORDER BY bid DESC) AS rn
      FROM  canadiancrudes where product like '%/%'
)
    SELECT o.product,o.term,b.bid,o.offer,b.bidcp,o.offercp 
    FROM o
    INNER JOIN b 
      ON o.product=b.product
      AND o.term=b.term
    WHERE o.rn=1
    AND b.rn=1

【讨论】:

  • 如果出价和出价没有排序,并且它们可能来自您之前问我的不同行怎么办?
  • 那得看你想得到哪一行了..高出价还是低出价。
  • 对于相同的产品和期限,我将最高出价及其相关的bidcp和最低的报价及其相关的offercp。我已经在表格和结果中编辑了我的问题中的数据
【解决方案2】:

使用 CTE 获取最小值、最大值 -

WITH MaxMin_CTE AS (
   SELECT product,term,max(bid) as bid,min(offer) AS Offer
   FROM CC
   GROUP BY product,term)
SELECT * from CC 
INNER JOIN MaxMin_CTE ON CC.product = MaxMin_CTE .product
AND CC.bid= MaxMin_CTE.bid AND CC.Offer = MaxMin_CTE.offer
AND CC.Term = MaxMin_CTE.Term

这是 SQL 小提琴 - http://sqlfiddle.com/#!6/a6588/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2015-12-15
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多