我的餐桌:
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子句中。
提前感谢您的提示。
答案 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
该行为是不确定的,当然不受支持,祝您好运!