2013-02-01 73 views
3

我有這個表:如何選擇按日期排序的不同列值的行?

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

+0

你如何確定2個「SKA」記錄中哪一個是正確的返回? – alroc

+0

@alroc:按日期,我​​想要最老的一個。 – Administrateur

+0

可能的重複http://stackoverflow.com/questions/10455233/distinct-by-order-date-and-products-sql-server-2008 – spajce

回答

3

試試這個

;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; 

SQL DEMO HERE

+0

如果col1,col2,col3值在多行中重複,則這不起作用。最好使用'row_number()'[DEMO](http://sqlfiddle.com/#!3/ea54e/1)不明顯 – Kaf

0

本應該做的

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 
+0

此查詢不起作用。它有很多語法錯誤,並且不完整 –

+0

對不起,我錯過了組中的其他字段。它應該現在工作 – pranag

+0

你忘了爲子查詢添加別名。這將不會返回所需的輸出,雖然 –

0

這取決於你想要什麼。你必須處理其他列。

從這個確切的數據,以獲取確切的結果:

select column1, column2, min(column3), min(column4) 
from #tmp 
group by column1, column2 

然而,一般欄3值可能來自比column4值不同的記錄,並且寫在SQL,如果你有多個具有相同column2值的column1值,您將獲得具有相同column2的多個結果。

+0

Column1將始終具有相同的值 – Administrateur

0
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 

這將讓獨特COLUMN2與最古老的欄3,並通過這些結果通過欄3

0

排序我認爲row_number()是更好的過濾表( Sql-Demo

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