2012-05-23 195 views
0

的選擇,我有以下查詢GROUP BY和列

SELECT McId, MAX(TimeDone) 
FROM Trace 
WHERE PcbId = 'C825514362' 
AND DeviceId <> 0 GROUP BY McId 

但我還需要從以下幾列ProgramDeviceId獲取值,OrderNo

是否有可能以某種方式結合起來,在同一查詢?

該查詢應該在mssql,mysql和oracle下運行。

+0

你想與這些附加列.. 請提供一些數據和預期的結果到底是什麼.. –

+0

@pratik GARG,剛剛拿到的數據是,在根據這些列,像我對於McId –

+0

ohh然後回答iiro發佈的是你期待的結果.. 在你的描述中,看起來你不想在沒有在group by子句中添加列的情況下做。 –

回答

1
SELECT 
McId, 
MAX(TimeDone), 
Program, 
DeviceId, 
OrderNo 
FROM Trace 
WHERE PcbId = 'C825514362' AND DeviceId <> 0 
GROUP BY 
McId, 
Program, 
DeviceId, 
OrderNo 
0

您是否嘗試過以下構造?

SELECT McId, MAX(TimeDone),Program,DeviceId,OrderNo FROM Trace WHERE PcbId = 'C825514362' AND DeviceId <> 0 GROUP BY McId,Program,DeviceId,OrderNo 
0

爲什麼不能將Program,DeviceId,OrderNo添加到組中?

如果您回答它會生成更多行,因爲「Program,DeviceId,OrderNo」的值不同,您希望顯示哪個值?

你總是可以嵌入在你組一個子查詢通過獲得這個值,但再次,如果你有一個以上的可能性,您需要定義規則,拿出方案,例如

SELECT McId, MAX(TimeDone), 
     (select top 1 program from trace t2 where t2.McId = trace.McId) as program 
FROM Trace 
WHERE PcbId = 'C825514362' AND DeviceId <> 0 
GROUP BY McId 
0

三種解決方案

  1. 考慮到你想要的Program,DeviceId,OrderNo

     
    SELECT McId, 
         MAX(TimeDone), 
         MAX(Program), 
         MAX(DeviceId), 
         MAX(OrderNo) 
    FROM Trace 
    WHERE PcbId = 'C825514362' AND DeviceId 0 
    GROUP BY McId; 
    
  2. MAX考慮你想要剩餘的列逗號,~分開,分隔

     
    SELECT McId, 
         MAX(TimeDone), 
         GROUP_CONCAT('~', Program, '~', DeviceId, '~', OrderNo) 
    FROM Trace 
    WHERE PcbId = 'C825514362' AND DeviceId 0 
    GROUP BY McId 
    
  3. 考慮要進行分組連同McId

     
    SELECT McId, 
         MAX(TimeDone), 
         Program, 
         DeviceId, 
         OrderNo 
    FROM Trace 
    WHERE PcbId = 'C825514362' AND DeviceId 0 
    GROUP BY McId, Program, DeviceId, OrderNo; 
    
2

嗯,我猜你想計劃,DEVICEID和OrderNo的值包含最大TimeDone的行。據我所知,你必須用子查詢來做到這一點。 類似的東西:

SELECT t.McID, t.Program, t.DeviceID, t.OrderNo, t.TimeDone 
FROM Trace t, 
    (SELECT MAX(TimeDone) as maxtime, McID 
FROM Trace 
GROUP BY McID) maxresults 
WHERE t.McID = maxresults.McID 
AND t.TimeDone= maxresults.maxtime;