SQL仅选择第一列上的唯一记录

时间:2018-08-11 08:59:03

标签: sql select

我的餐桌:

Code Price 
A |  200
A |  199
B |  300
B |  320
C |  400
C |  410

如何选择这些数据以获取

A |  200
B |  300
C |  400

我想到的是

SELECT DISTINCT 

但是它不起作用,如果我尝试使用

GROUP BY CODE 

我得到:

在选择列表中,'Table.Code'列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

提前感谢您的提示。

3 个答案:

答案 0 :(得分:0)

create table #12 (code varchar(100),price int)

insert into #12 values ('a',200),('b',199),('B',300),('b',320)


SELECT * FROM (SELECT *,ROW_NUMBER() OVER( PARTITION BY CODE ORDER BY CODE) AS RN FROM #12) AS TN
WHERE RN =1

答案 1 :(得分:0)

提供 a 结果的一种方法是:

Select code, min(price) minprice, max(price) maxprice
from Table
Group by code

这将获得每个代码的最低和最高价格。您的请求的结果中包含最小值和最大值。您可以为该特定结果集提供可靠规则(用简单的英语)吗?

如果您希望为每个代码列出“第一”价格,那么您的表就需要诸如自动递增的索引idx(或时间戳)列之类的内容。拥有此专栏后,您可以修改形式使用@Ramji或@Gordy的ROW_NUMBER()解决方案:

;with first_price_per_code as (
  select Code, Price, r = row_number()
  over (partition by Code order by idx)
  from Table
)
select Code, Price from first_price_per_code 
where r = 1

上面的代码是特定于SQL Server的,但是类似的事情也可以在Mysql或其他RDBMS中完成。

否则-没有有一条规则-以下内容也会产生您的结果(→这只是个玩笑!):

select code, round(avg(price),-2) price
from Table group by code

答案 2 :(得分:0)

sql没有“先出现”的汇总,但是有一个hack:

with first_price_per_code as (
    select Code, Price, r = row_number() over (partition by Code order by (select null))
    from Table
) select Code, Price from first_price_per_code where r = 1

该行为是不确定的,当然不受支持,祝您好运!