none
查第一筆資料 RRS feed

  • 問題

  • 大家好,想請問一個問題是要如何下SQL
    現有一個資料
    序號 訂貨日 下訂單日期 送貨日 簽收日 給款日
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/25
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/26
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/27
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/28
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/29
    B   2011/01/01  2011/06/08 2011/08/20   2011/08/21 2011/08/25
    B   2011/01/01  2011/06/08 2011/08/20   2011/08/21 2011/08/26
    C   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/30
    整理成下列資料,要如何下sql。
    A   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/25
    B   2011/01/01  2011/06/08 2011/08/20   2011/08/21 2011/08/25
    C   2011/01/01  2011/06/07 2011/08/20   2011/08/21 2011/08/30
    上面的資料規則是每一個序號內的給款日期是最早的

    2012年1月5日 下午 03:12

解答

  • Reference:

    [SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

     

    /*模擬測試數據*/
    Create table testTable
    (
     序號 varchar(5),
     訂貨日 date,
     下訂單日期 date,
     送貨日 date,
     簽收日 date,
     給款日 date
    
    
    )
    Go
    Insert into testTable (序號,訂貨日,下訂單日期,送貨日,簽收日,給款日)
    Values 
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/25'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/26'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/27'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/28'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/29'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/25'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/26'),
    ('C','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/30')
    Go
    Select 序號,訂貨日,下訂單日期,送貨日,簽收日,給款日 from (
    Select *,ROW_NUMBER() over (partition by 序號 Order by 給款日 ASC) AS no from testTable
    ) t Where no=1
    

    Result:

     

     



    2012年1月5日 下午 05:25
  • 借用一下Shadow大的測試資料,如果你是SQL Server 2005以上可以用Row_Number來做,如果是SQL Server 2000或許可以參考下列的做法。

    /*模擬測試數據*/
    declare @t table
    (
     序號 varchar(5),
     訂貨日 date,
     下訂單日期 date,
     送貨日 date,
     簽收日 date,
     給款日 date
    )
    
    Insert into @t (序號,訂貨日,下訂單日期,送貨日,簽收日,給款日)
    Values 
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/25'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/26'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/27'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/28'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/29'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/25'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/26'),
    ('C','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/30')
    
    select t1.*
    from @t t1
    inner join 
    (
    select 序號,MIN(給款日) as 給款日
    from @t
    group by 序號
    ) t2
    on t1.序號 = t2.序號
    and t1.給款日 = t2.給款日
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2012年1月6日 上午 01:08
    版主

所有回覆

  • Reference:

    [SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

     

    /*模擬測試數據*/
    Create table testTable
    (
     序號 varchar(5),
     訂貨日 date,
     下訂單日期 date,
     送貨日 date,
     簽收日 date,
     給款日 date
    
    
    )
    Go
    Insert into testTable (序號,訂貨日,下訂單日期,送貨日,簽收日,給款日)
    Values 
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/25'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/26'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/27'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/28'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/29'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/25'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/26'),
    ('C','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/30')
    Go
    Select 序號,訂貨日,下訂單日期,送貨日,簽收日,給款日 from (
    Select *,ROW_NUMBER() over (partition by 序號 Order by 給款日 ASC) AS no from testTable
    ) t Where no=1
    

    Result:

     

     



    2012年1月5日 下午 05:25
  • 借用一下Shadow大的測試資料,如果你是SQL Server 2005以上可以用Row_Number來做,如果是SQL Server 2000或許可以參考下列的做法。

    /*模擬測試數據*/
    declare @t table
    (
     序號 varchar(5),
     訂貨日 date,
     下訂單日期 date,
     送貨日 date,
     簽收日 date,
     給款日 date
    )
    
    Insert into @t (序號,訂貨日,下訂單日期,送貨日,簽收日,給款日)
    Values 
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/25'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/26'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/27'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/28'),
    ('A','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/29'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/25'),
    ('B','2011/01/01','2011/06/08','2011/08/20','2011/08/21','2011/08/26'),
    ('C','2011/01/01','2011/06/07','2011/08/20','2011/08/21','2011/08/30')
    
    select t1.*
    from @t t1
    inner join 
    (
    select 序號,MIN(給款日) as 給款日
    from @t
    group by 序號
    ) t2
    on t1.序號 = t2.序號
    and t1.給款日 = t2.給款日
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2012年1月6日 上午 01:08
    版主