none
請問如何Group By欄位一,其他欄位都相依於MAX(欄位二)? RRS feed

  • 一般討論

  • 我用了join語法連結了四個table,再把兩個join的結果union起來。
    (所以整串語法join了八個table,而前四table與後四table的欄位是一樣的)

    因為同一個意義的資料在前四table和後四table中有出現,但各欄位不相同,
    我想要用Group by來取得這兩筆資料的其中一筆,不一定是前筆或後筆,
    但那一筆的其他欄位需要從相同的四個table內出來。

    直接看例子,
    下面這四筆是兩個姓名(吳英雄、陳在天)的資料,
    是我經過上述join和union之後的結果。
    =============================

    標籤          姓名   編號  紀錄時間             狀態碼  處理狀況    後面還有很多欄位
    ----------------------------------------------------------------------------------
    Tag-12345678  吳英雄 A0001 2009/11/13 11:30:00  03      處理狀況一
    Tag-87654321  吳英雄 A0001 2009/11/13 09:00:00  07      未處理
    Tag-11111111  陳在天 A0002 2009/11/13 11:40:00  02      處理狀況二
    Tag-22222222  陳在天 A0002 2009/11/13 08:00:00  04      已處理
    =============================

    我想要取得每一個人一筆資料,取紀錄時間比較後面的那筆資料,
    也就是【希望結果】是:
    =============================

    標籤          姓名   編號  紀錄時間             狀態碼  處理狀況    後面還有很多欄位
    ----------------------------------------------------------------------------------
    Tag-12345678  吳英雄 A0001 2009/11/13 11:30:00  03      處理狀況一
    Tag-11111111  陳在天 A0002 2009/11/13 11:40:00  02      處理狀況二
    =============================

    我先前用的語法是

    SELECT MAX(紀錄時間) as 紀錄時間, MAX(狀態碼) as 狀態碼, ...其他要取出的欄位都放在MAX函式中...
    FROM (文章最初所述join與union語法)
    GROUP BY 身份
    ORDER BY 編號

    結果因為同一列的狀態碼的大小和紀錄時間的大小是不一致的,
    所以會讓MAX()函式取得不同列的那個欄位出來自己組和,
    產生了下面這種【不是想要的結果】,根本不存在的狀況(各欄位資料不一致)。
    =============================

    標籤          姓名   編號  紀錄時間             狀態碼  處理狀況    後面還有很多欄位
    ----------------------------------------------------------------------------------
    Tag-87654321  吳英雄 A0001 2009/11/13 11:30:00  07      處理狀況一
    Tag-22222222  陳在天 A0002 2009/11/13 11:40:00  04      處理狀況二
    =============================


    請問,
    我該如何下語法,
    才能取得我想要的那些列呢?

    謝謝


    PS.我用的是SQL Server 2005 Express

    2009年11月13日 上午 04:15

所有回覆

  • 這要用子查詢,先Union, 把Union的結果當來源資料再取MAX
    請參閱 MSDN文件庫
    [SQL Server 2005 線上叢書 (2008 年 11 月) 子查詢基本原則 ]
    [SQL Server 2005 線上叢書 (2008 年 11 月) 如何:建立子查詢 (Visual Database Tools) ]


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月13日 上午 05:20
  • 我那四列的結果已經是用了子查詢,子查詢內有Union,外面的查詢才用MAX。

    目前用的語法是
    SELECT MAX(紀錄時間) as 紀錄時間, MAX(狀態碼) as 狀態碼, ...其他要取出的欄位都放在MAX函式中...
    FROM (文章最初所述join與union語法)
    GROUP BY 身份
    ORDER BY 編號

    但結果不是我要的。

    有仔細一點的語法嗎?


    2009年11月13日 上午 05:35
  • 喔, 抱歉沒看清楚, 原來有兩個MAX. 這樣會有點問題, 先試著不要用 MAX(狀態碼)
    因為看起來狀態碼並沒有 MAX的必要
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月13日 上午 05:40
  • 如果不寫MAX,那些欄位就沒辦法呈現出來,我需要那些欄位的資料。

    但經過這一提醒,我想說不定可以把子查詢內的join搬到外面來,
    已經group完確定有哪些row之後再join其他需要顯示的欄位。

    也許可以試看看
    先感謝Bill chung


    其實問這個問題也想瞭解Group By的語法
    似乎寫在select後面的欄位,必須寫在特殊function內或在group by後面,
    而特殊function也只知道 MAX(), MIN(), SUM(), COUNT()
    不知道還有什麼

    2009年11月13日 上午 05:48
  • 函數請參考 [SQL Server 2005 線上叢書 (2008 年 11 月) 函數 (Database Engine) ]
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月13日 上午 05:58
  • 我嘗試著先在子查詢內查好需要的row,然後再跟其他要顯示的欄位做join。
    但過程中發現一件事,在子查詢內,因為用到了group by 編號,所以Select後面只能加 MAX(紀錄時間), 姓名。
    所以表示,我如果在確定了row之後,想要跟其他表格做join,就只能用這兩個欄位而已。
    萬一同一時間內,有不同姓名的人做了不同的事,那麼回頭來join時,就會發生牛頭不對馬嘴的問題。

    原本好像可行的路,又變成不太可行了。 : (

    找過可跟Group By搭配的函式,似乎沒有合用的。


    回文中也發現,我的原文內的語法寫錯了,是GROUP BY 編號,不是身份,身份在這個討論串中沒有定義清楚。

    SELECT MAX(紀錄時間) as 紀錄時間, MAX(狀態碼) as 狀態碼, ...其他要取出的欄位都放在MAX函式中...
    FROM (文章最初所述join與union語法)
    GROUP BY 編號
    ORDER BY 編號
    2009年11月13日 上午 06:17