Sql 如何选择按日期排序的列值不同的行?
我有这张桌子:Sql 如何选择按日期排序的列值不同的行?,sql,sql-server,sql-server-2008,tsql,sql-server-2005,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,我有这张桌子: create table #tmp ( column1 varchar(3), column2 varchar(5), column3 datetime, column4 int ) insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10) insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15) insert in
create table #tmp
(
column1 varchar(3),
column2 varchar(5),
column3 datetime,
column4 int
)
insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10)
insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15)
insert into #tmp values ('AAA', 'SKB', '2013-01-31 00:00:00', 20)
insert into #tmp values ('AAA', 'SKB', '2013-01-15 00:00:00', 5)
insert into #tmp values ('AAA', 'SKC', '2013-02-01 00:00:00', 25)
我想选择列2不同的行,按列3排序。
这是期望的结果:
Col1 Col2 Col3 Col4
AAA SKB 2013-01-15 00:00:00.000 5
AAA SKA 2013-01-31 00:00:00.000 15
AAA SKC 2013-02-01 00:00:00.000 25
我该怎么做?我正在使用MS SQL 2005和2008,这应该可以
http://sqlfiddle.com/#!3/d3dad/11
select * from
(
select max(column1) as column1, column2 as column2, max(column3) as column3,
max(column4) as column4
from #tmp
group by column2
) a
order by column3
这取决于你想要什么。您必须处理其他列 从准确的数据中,为了得到准确的结果:
select column1, column2, min(column3), min(column4)
from #tmp
group by column1, column2
但是,通常情况下,column3值可能来自与column4值不同的记录,并且如SQL中所述,如果有多个column1值具有相同的column2值,则将使用相同的column2得到多个结果。尝试此方法
;with cte as
(
select *,
row_number() over (partition by column1, column2
order by column3) rnk
from #tmp
) select * from cte where rnk = 1
order by column3;
这将使用最旧的列3获得唯一的列2,并通过按列3排序的结果筛选表。我认为行数()更好(
)
如何确定2条SKA记录中哪一条是要返回的正确记录?@alroc:按日期,我想要最旧的一条。可能重复此查询将不起作用。它有许多语法错误,而且不完整。或者,我错过了group by中的其他字段。如果您忘记为子查询添加别名,现在应该可以使用了。这将不会返回所需的输出,尽管我最终在SQLFIDLE上运行并发布了运行脚本!Column1将始终具有相同的值如果col1、col2、col3值在多行中重复,则此操作将不起作用。最好使用
行编号()
不区分
SELECT t.column1, t.column2, t.column3, t.column4
FROM @tmp t
INNER JOIN (SELECT DISTINCT column2, MIN(column3) [column3] FROM @tmp GROUP BY column2) v
ON t.column2 = v.column2 AND t.column3 = v.column3
ORDER BY t.column3
select column1, column2, column3, column4
from (
select column1, column2, column3, column4,
row_number() over (partition by column2 order by column3) rn
from #tmp ) A
where rn=1
order by column3