我有一张表格如下:
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
我在这里做错了什么?
答案 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
拥有最早日期的客户!
答案 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