【问题标题】:How to GROUP and choose lowest value in SQL and associated column如何在 SQL 和关联列中分组和选择最小值
【发布时间】:2015-11-15 04:05:33
【问题描述】:

这个问题是对this 早先问题(不是我问的)的扩展。

我有一个包含以下字段的表格:

 id  |   date_from  | date_to      |   price  | priceName
 --------------------------------------------------------
 CK1     22-12-2012   29-12-2012       800      low
 CK1     22-12-2012   29-12-2012       1200     medium
 CK2     22-12-2012   29-12-2012       1400     high
 CK2     22-12-2012   29-12-2012       1800     very high
 CK2     22-12-2012   29-12-2012       2200     extortionate

如何创建一个 SQL 选择,按 ID、DATE_FROM、DATE_TO 对结果进行分组,并从价格和与最低价格关联的价格名称中选择最低值

所以结果是

 CK1     22-12-2012   29-12-2012       800     low
 CK2     22-12-2012   29-12-2012       1400    high

从上一个问题我可以做到:

select id, date_from, date_to, min(price)
from table
group by id, date_from, date_to

如何扩展它以仅选择与 min(price) 匹配的 priceName?按 priceName 分组将不起作用,因为它不受 min(price) 的限制。

【问题讨论】:

  • 您的表是否有某种 row_id 主键或复合键(id、date_from、date_to、price)?您可以将查询包装在 CTE 中,并根据主查询中的该键获取缺失的 praceName。 WITH cte AS (SELECT uniqueId, ...) SELECT * FROM table_name t JOIN cte c ON t.uniqueId = c.uniqueId
  • 它是一个复合键:id、date_from、date_to(不是价格)。

标签: sql-server-2008 tsql group-by


【解决方案1】:

使用 CTE:

WITH cte (id, date_from, date_to, minprice) AS (
     SELECT id, date_from, date_to, [minprice] = min(price)
     FROM table_name
     GROUP BY id, date_from, date_to)
SELECT
    c.id, c.date_from, c.date_to, c.[minprice], t.priceName 
FROM table_name t 
JOIN cte c 
ON t.id = c.id
    AND t.date_from = c.date_to
    AND t.data_to = c.date_to

【讨论】:

    【解决方案2】:

    一种方法是使用rank 窗口函数:

    SELECT id, date_from, date_to, price, priceName
    FROM   (SELECT id, date_from, date_to, price, priceName,
                   RANK() OVER (PARTITION BY id, date_from, date_to
                                ORDER BY price ASC) AS rk
            FROM   mytable) t
    WHERE  rk = 1
    

    【讨论】:

      【解决方案3】:

      您可以使用子查询。

      Select Table.id,Date_from,date_to,MinPrice,PriceName
      from
         (select id, min(price) as MinPrice
         from table
         group by id) t1
      INNER JOIN table ON t1.id=table.id and t1.MinPrice=table.Price
      Group by id,Date_from,date_to,MinPrice,PriceName
      

      【讨论】:

      • 谢谢,这似乎是最简单的答案之一,它对我有用。
      【解决方案4】:

      试试这个:

      Select t.*,t1.priceName from (
      select id, date_from, date_to, min(price)
      from table
      group by id, date_from, date_to) t
      join table t1 on t.id =t1.id 
      and t.date_from =t1.date_from  
      and t.date_to =t1.date_to
      and t.price =t1.price
      

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 2015-10-15
        • 1970-01-01
        • 2020-05-16
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多