2012-05-23 9 views
0

У меня есть следующий запросГруппировка и выбор столбцов

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

Но мне также нужно получить значения из следующих столбцов Program, DeviceId, OrderNo

Можно ли каким-то образом объединить, что в то же самое запрос?

Этот запрос должен выполняться под командами mssql, mysql и oracle.

+0

, что именно вы хотите с этими дополнительными столбцами .. просьба предоставить некоторые данные и ожидаемый результат .. –

+0

@pratik Garg, только чтобы получить данные, которые в соответствии с этими колоннами, как я сделайте для McId –

+0

ohh, тогда ответ, отправленный пользователем iiro, - это то, что вы ожидаете. В вашем описании это выглядело так, будто вы не хотите обойтись без добавления столбцов в группе по предложению. –

ответ

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

Почему вы не можете добавить программу, 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. Учитывая вы хотите MAX из 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. Учитывая вы хотите остальные столбцы как запятую с ~ в качестве разделителя

     
    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; 
Смежные вопросы