2012-10-08 25 views
0

一個datavalue:需要獲得一個ID的最小值和最大值日期與分鐘(日期)和max(日期)datavalue在考慮這個數據在同一列

ID  FirstDate  LastDate  ItemId 
12A  05-11-2011  05-11-2011  0 
12A  12-19-2011  12-19-2011  3 
12A  01-04-2012  01-04-2012  3 
12A  01-19-2012  01-19-2012  12 
64B  06-15-2010  06-15-2010  0 
64B  08-19-2011  08-19-2011  3 

我想看看:

ID  FirstDate FirstItemId  LastDate  LastItemId 
12A 05-11-2011  0   01-19-2012  12 
64B 06-15-2010  0   08-19-2011  3 
+4

*** *** SQL只是*結構化查詢語言* - 一個由許多數據庫所使用的語言系統,但不是一個數據庫產品...很多東西都是特定於供應商的 - 所以我們真的需要知道您使用的數據庫系統**(以及哪個版本)...... –

+0

我試過了已成功獲取FirstItemId值:select ID,ItemId \t \t從(由項目Id,ID,FirstDate具有MIN(FirstDate )= FirstDate從表1中選擇項目Id,ID,ROW_NUMBER()以上(分區由ID順序由MIN(FirstDate))[ROWNUM] 基團)的 其中ROWNUM = 1 order by ID,ItemId – user1729486

回答

0

在它的最基本的形式,你可能會想在SQL min and group by功能結合起來:

select ID 
    , min(FirstDate) as FirstDate 
    , min(ItemId) as FirstItemId 
    , max(LastDate) as LastDate 
    , max(ItemId) as LastItemId 
from MyTable 
group by ID 

注意,howeve r,這將返回每列的絕對最小值和最大值,不一定與FirstDate相對應的ItemId等,除非數據碰巧是這樣。這裏是一個可能的替代方案,要獲得基於第一/最後日期ItemIDs:

-- Get ItemIDs that correspond to First/Last Dates 
select ID 
    , FirstDate 
    , (select min(ItemID) from Mytable where ID = a.ID and FirstDate = a.FirstDate) as FirstItemID 
    , LastDate 
    , (select max(ItemID) from Mytable where ID = a.ID and LastDate = a.LastDate) as LastItemID 
from (
    select ID 
     , min(FirstDate) as FirstDate 
     , max(LastDate) as LastDate 
    from Mytable 
    group by ID 
) as a 

我發現,相關子查詢往往比窗口函數(也可能更容易理解)更快,但你必須測試中你的環境與你的數據。

+0

我正在SQL 2008中工作,並且我只能夠爲Min(FirstDate)拉取ItemId。 SELECT ID,ItemId from(選擇ItemId,ID,row_number()over(按ID排序MIN(firstDate)分隔)[rownum] from mytable1 group by ItemId,ID,FirstDate具有MIN(FirstDate)= FirstDate)a where rownum = 1通過ID訂購,ItemId – user1729486

+0

我明白了。有任何解決方案爲你工作? bluefeet也有很好的貢獻。 –

1

您可以使用窗口函數的組合來得到這樣的結果:

select id, 
    max(case when FirstRowNumber= 1 then firstdate end) firstdate, 
    max(case when FirstRowNumber= 1 then itemid end) firstitemId, 
    max(case when LastRowNumber= 1 then lastdate end) lastdate, 
    max(case when LastRowNumber= 1 then itemid end) lastitemId 
from 
(
    select id, firstdate, lastdate, itemid, 
    row_number() over(partition by id order by firstdate) FirstRowNumber, 
    row_number() over(partition by id order by lastdate desc) LastRowNumber 
    from yourtable 
) x 
where FirstRowNumber= 1 
    or LastRowNumber= 1 
group by id 

SQL Fiddle with Demo

此解決方案將row_number分配給ASC/DESC日期順序中的記錄。那麼你只關心row_number = 1的記錄。然後我應用了一個聚合和一個CASE聲明來獲得正確的結果。

或者你可以使用一個非常難看UNPIVOTPIVOT解決方案:

select * 
from 
(
    select id, 
    val, 
    case when firstrownumber = 1 and col = 'firstdate' 
      then 'firstdate' 
     when firstrownumber = 1 and col = 'itemid' 
      then 'firstitemid' 
     when LastRowNumber = 1 and col = 'lastdate' 
      then 'lastdate' 
     when LastRowNumber = 1 and col = 'itemid' 
      then 'lastitemid' 
     else '' end col 
    from 
    (
    select id, 
     convert(varchar(10), firstdate, 120) firstdate, 
     convert(varchar(10), lastdate, 120) lastdate, 
     cast(itemid as varchar(10)) itemid, 
     row_number() over(partition by id order by firstdate) FirstRowNumber, 
     row_number() over(partition by id order by lastdate desc) LastRowNumber 
    from yourtable 
) x 
    unpivot 
    (
    val for col in (firstdate, lastdate, itemid) 
) u 
) x1 
pivot 
(
    max(val) 
    for col in ([firstdate], [firstitemid], 
       [lastdate], [lastitemid]) 
) p 

SQL Fiddle with Demo

相關問題