在Sql中,如何选择最后五个唯一的行和行不重复...帮助我 [英] In Sql,How Can I Select Last Five Unique Row And Rows Are Not Repeated..Help Me
本文介绍了在Sql中,如何选择最后五个唯一的行和行不重复...帮助我的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
fbalance fdate facno
10 , 000 。 00 21/12/2013 010001801000007
15 , 000 。 00 21/01/2014 010001801000007
20 , 000 。 00 15/01/2014 010001801000007
29 , 550 。 00 21/01/2014 010001801000007
34 , 550 。 00 21 / 02/2014 010001801000007
4 , 000 跨度> 。 00 21/12/2013 010001801000008
8 , 000 。 00 21/12/2013 010001801000008
12 , 000 。 00 21/01/2014 010001801000008
16 , 000 。 00 21/02/2014 010001801000008
50 , 000 。 00 22/11/2012 010001801000009
100 , 000 。 00 22/12/2012 010001801000009
70 , 000 。 00 22/01/2014 010001801000010
80 , 000 。 00 22/02/2014 010001801000010
1 , 000 。 00 23/11/2013 010001801000012
1 , 500 。 00 23/12/2013 010001801000012
2 , 000 。 00 23/01/2014 010001801000012
2 , 500 。 00 23/02/2014 010001801000012
3 , 000 。 00 23/03/2014 010001801000012
3 ,< span class =code-digit> 500 。 00 23/04/2014 010001801000012
500 。 00 23/01/2014 010001801000013
解决方案
您可以尝试这样的事情。
但结果返回,来自预期的额外记录,但我假设它可能已从列表中遗漏。
- 设置数据;
声明 @ f table (fbalance 十进制( 10 , 2 ),fdate datetime ,facno varchar ( 50 ));
插入 进入 @ f 值( 10000 。 00 ,' 2013年12月21日',' 010001801000007' 跨度>);
插入 进入 @ f 值( 15000 。 00 ,' 21 jan 2014',' 010001801000007' 跨度>);
插入 进入 @ f 值( 20000 。 00 ,' 15 jan 2014',' 010001801000007' 跨度>);
插入 进入 @ f 值( 29550 。 00 ,' 21 jan 2014',' 010001801000007' 跨度>);
插入 进入 @ f 值( 34550 。 00 ,' 21 feb 2014',' 010001801000007' 跨度>);
插入 进入 @ f 值( 4000 。 00 ,' 2013年12月21日',' 010001801000008' 跨度>);
插入 进入 @ f 值( 8000 。 00 ,' 2013年12月21日',' 010001801000008' 跨度>);
插入 进入 @ f 值( 12000 。 00 ,' 21 jan 2014',' 010001801000008' 跨度>);
插入 进入 @ f 值( 16000 。 00 ,' 21 feb 2014',' 010001801000008' 跨度>);
插入 进入 @ f 值( 50000 。 00 ,' 22 nov 2012',' 010001801000009' 跨度>);
插入 进入 @ f 值( 100000 。 00 ,' 2012年12月22日',' 010001801000009' 跨度>);
插入 进入 @ f 值( 70000 。 00 ,' 2014年1月22日,' 010001801000010' 跨度>);
插入 进入 @ f 值( 80000 。 00 ,' 22 feb 2014',' 010001801000010' 跨度>);
插入 进入 @ f 值( 1000 。 00 ,' 23 nov 2013',' 010001801000012' 跨度>);
插入 进入 @ f 值( 1500 。 00 ,' 2013年12月23日',' 010001801000012' 跨度>);
插入 进入 @ f 值( 2000 。 00 ,' 23 jan 2014',' 010001801000012' 跨度>);
插入 进入 @ f 值( 2500 。 00 ,' 23 feb 2014',' 010001801000012' 跨度>);
插入 进入 @ f 值( 3000 。 00 ,' 2014年3月23日',' 010001801000012' 跨度>);
插入 进入 @ f 值( 3500 。 00 ,' 23 apr 2014',' 010001801000012' 跨度>);
插入 进入 @ f 值( 500 。 00 ,' 23 jan 2014',' 010001801000013' 跨度>);
- 获取每个facno的最大fdate记录
< span class =code-keyword>选择
f。*
来自 @f f
内部 加入(
选择 facno,max(fdate)fdateMax
来自 @ f
group by facno
)fMaxDt
f.facno = fMaxDt.facno
和
f.fdate = fMaxDt.fdateMax
order by 3
;
- result
fbalance fdate facno
34550 。 00 2014-02-21 010001801000007
16000 。 00 2014-02-21 010001801000008
100000 。 00 2012-12-22 010001801000009
80000 。 00 2014-02-22 010001801000010 - 来自预期的额外记录
3500 。 00 2014-04-23 010001801000012
500 。 00 2014-01-23 01 0001801000013
- 注意:facno和fdate必须是唯一的,以便查询返回一个记录每个facno和max facno
使用它:
选择 MAX( convert ( datetime ,fdate,< span class =code-digit> 103 )),facno,max(fbalance)来自 tbl_test1 group by facno
还有一件事你必须删除 fbalance 列中的逗号(,),不能将其转换为浮点数。
在查询中使用distinct和order by
fbalance fdate facno
10,000.00 21/12/2013 010001801000007
15,000.00 21/01/2014 010001801000007
20,000.00 15/01/2014 010001801000007
29,550.00 21/01/2014 010001801000007
34,550.00 21/02/2014 010001801000007
4,000.00 21/12/2013 010001801000008
8,000.00 21/12/2013 010001801000008
12,000.00 21/01/2014 010001801000008
16,000.00 21/02/2014 010001801000008
50,000.00 22/11/2012 010001801000009
100,000.00 22/12/2012 010001801000009
70,000.00 22/01/2014 010001801000010
80,000.00 22/02/2014 010001801000010
1,000.00 23/11/2013 010001801000012
1,500.00 23/12/2013 010001801000012
2,000.00 23/01/2014 010001801000012
2,500.00 23/02/2014 010001801000012
3,000.00 23/03/2014 010001801000012
3,500.00 23/04/2014 010001801000012
500.00 23/01/2014 010001801000013
解决方案
You could try something like this.
But the result return, an extra record from the expected, but I am assuming it may have been missed from the list.
--setup data; declare @f table (fbalance decimal(10,2), fdate datetime, facno varchar(50)); insert into @f values (10000.00, '21 dec 2013', '010001801000007'); insert into @f values (15000.00, '21 jan 2014', '010001801000007'); insert into @f values (20000.00, '15 jan 2014', '010001801000007'); insert into @f values (29550.00, '21 jan 2014', '010001801000007'); insert into @f values (34550.00, '21 feb 2014', '010001801000007'); insert into @f values (4000.00, '21 dec 2013', '010001801000008'); insert into @f values (8000.00, '21 dec 2013', '010001801000008'); insert into @f values (12000.00, '21 jan 2014', '010001801000008'); insert into @f values (16000.00, '21 feb 2014', '010001801000008'); insert into @f values (50000.00, '22 nov 2012', '010001801000009'); insert into @f values (100000.00, '22 dec 2012', '010001801000009'); insert into @f values (70000.00, '22 jan 2014', '010001801000010'); insert into @f values (80000.00, '22 feb 2014', '010001801000010'); insert into @f values (1000.00, '23 nov 2013', '010001801000012'); insert into @f values (1500.00, '23 dec 2013', '010001801000012'); insert into @f values (2000.00, '23 jan 2014', '010001801000012'); insert into @f values (2500.00, '23 feb 2014', '010001801000012'); insert into @f values (3000.00, '23 mar 2014', '010001801000012'); insert into @f values (3500.00, '23 apr 2014', '010001801000012'); insert into @f values (500.00, '23 jan 2014', '010001801000013'); --get max fdate record for each facno select f.* from @f f inner join ( select facno, max(fdate) fdateMax from @f group by facno ) fMaxDt on f.facno = fMaxDt.facno and f.fdate = fMaxDt.fdateMax order by 3 ;
--result fbalance fdate facno 34550.00 2014-02-21 010001801000007 16000.00 2014-02-21 010001801000008 100000.00 2012-12-22 010001801000009 80000.00 2014-02-22 010001801000010 --Extra record from the expected 3500.00 2014-04-23 010001801000012 500.00 2014-01-23 010001801000013 --note: facno and fdate need to be unique for the query to return one record for each facno and max facno
use this :
select MAX(convert(datetime,fdate,103)),facno,max(fbalance ) from tbl_test1 group by facno
and one more thing is you must Remove Comma (,) at your fbalance Column you can't Cast into float.
Use distinct and order by in your query.
这篇关于在Sql中,如何选择最后五个唯一的行和行不重复...帮助我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文