分组依据和列的选择

时间:2012-05-23 09:55:24

标签: mysql sql sql-server oracle

我有以下查询

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

但我还需要从以下列ProgramDeviceIdOrderNo

获取值

是否有可能以某种方式将其组合在同一个查询中?

此查询应在mssql,mysql和oracle下运行。

5 个答案:

答案 0 :(得分:2)

好吧,我猜你想要获得包含TimeDone最大值的行的Program,DeviceId和OrderNo的值。据我所知,你必须用子查询来做到这一点。 这样的事情:

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;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您是否尝试过以下构造?

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

答案 3 :(得分: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

答案 4 :(得分:0)

三种解决方案。

  1. 考虑到您需要MAX的{​​{1}}

    SELECT McId, 
           MAX(TimeDone),
           MAX(Program),
           MAX(DeviceId),
           MAX(OrderNo)
    FROM  Trace
    WHERE   PcbId = 'C825514362' AND  DeviceId  0
    GROUP BY McId;
    
  2. 考虑到您希望剩余的列以逗号分隔,并以Program,DeviceId,OrderNo作为分隔符

    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;