使用sql从表中选择特定行但获得预期结果

时间:2014-07-29 14:49:15

标签: sql sql-server-2008

我有一张表格如下:

No  Percent date    
123 0.25    20061026    
123 0.75    20040126    
123 0.25    20061126    
123 0.25    20061226    

我希望o / p只有一行,日期最短,如下所示

123 0.75    20040126                

但使用以下查询

select no,percent, min(date) 
from a 
group by pno,percent            

我得到2行

123 0.25    20061026    
123 0.75    20040126    

我在这里做错了什么?

6 个答案:

答案 0 :(得分:3)

这是因为123 0.75是一个不同于123 0.25的组,这就是你得到两行的原因。

这正是你要求的:“给我每个(No,Perc)对的最小日期。”

答案 1 :(得分:2)

尝试

select TOP 1 no,percent, [date] 
from a 
ORDER by [date]

编辑:根据评论,也许你想要更像这样的东西?

DECLARE @T TABLE (Cust INT, Prct DECIMAL(6,2), Dt INT)
INSERT INTO @T VALUES (123, 0.25, 20061026), (123, 0.75, 20040126)
    , (123, 0.25, 20061126), (123, 0.25, 20061226)
    , (124, 0.27, 20061026), (124, 0.65, 20071226)
    , (124, 0.57, 20050602);
WITH cteRanked as (SELECT *, ROW_NUMBER() OVER(PARTITION BY Cust ORDER BY Dt) as RC FROM @T)
SELECT Cust , Prct , Dt  FROM cteRanked WHERE RC = 1

给出结果

Cust    Prct    Dt
123 0.75    20040126
124 0.57    20050602

答案 2 :(得分:0)

或者您可以尝试一些时髦的查询:

select no,percent, date 
from a
where date = (select min(date) from a)

答案 3 :(得分:0)

如果您只想要最新记录(并且百分比并不重要),请使用Robert Sheahan解决方案! 只会显示1条记录。看("选择TOP 1")

如果你想按百分比分组是正确的!

更详细地解释您对查询的期望。

编辑: "你是说你想要每个客户最老的? - > YES" 因此,如果您有100个客户的百万条记录,您会获得100行返回? - >是

http://sqlfiddle.com/#!3/1a15fa/11

基于罗伯特解决方案:

    CREATE TABLE Table1
(
 no int,percent2 decimal(5,2),date3 date
);

    INSERT INTO Table1
 (no, percent2, date3)
 VALUES
 (123, 0.25, '20061026'),
 (123, 0.75, '20040126'),
 (124, 0.45, '20060726'),
 (124, 0.55, '20031126'),
 (125, 0.65, '20040526'),
 (125, 0.35, '20060926'),
 (126, 0.25, '20061226');


 WITH cteRanked as (SELECT *, ROW_NUMBER() OVER(PARTITION BY no ORDER BY date3) as RC FROM Table1)
 SELECT no, percent2, date3 FROM cteRanked WHERE RC = 1

结果:

 NO     PERCENT2    DATE3
 123    0.75    2004-01-26
 124    0.55    2003-11-26
 125    0.65    2004-05-26
 126    0.25    2006-12-26

拥有最早日期的客户!

请参阅: http://sqlfiddle.com/#!3/1a15fa/11

答案 4 :(得分:0)

您按照编号和百分比进行分组,因此数据库会为编号和百分比的每个不同组合抛出一行(这就是为什么您得到两行)。对于每个组,它将计算最小日期,因此您获得两个组的最小日期:(123,0.25)和(123,0.75)

您可以通过按递增顺序排序然后使用TOP子句限制到第一行(检查sqlfiddle)来解决此问题:

SELECT TOP 1 number, perc, date
FROM sof 
ORDER by date

另一种方法是使用子查询返回最小日期,然后在WHERE子句中使用它进行过滤(检查sqlfiddle):

SELECT
   number, perc, date 
FROM 
   sof, (
       SELECT MIN(date) min_date
       FROM sof
   ) md
WHERE sof.date = md.min_date

答案 5 :(得分:0)

您也可以尝试:

select a.*
from table1 a
inner join (select no,min(date) mindate from table1 group by no) b
    on a.no=b.no and a.date=b.mindate