子选择具有最大列的行

时间:2014-06-23 13:16:43

标签: mysql stored-procedures

我试图做一些听起来很简单的事情,但我已经绕圈子走了一圈......

我有一个目前正常工作的存储过程,只缺少一点功能,返回一个名称以进行相应的最大计算......

所以我回来了

平均计算& 最大计算,但想要从其他列返回'为最大值。

这是我的SP的一个例子,道歉,它似乎不太自然,因为我不得不重命名和省略非相关位,所以看起来似乎有点做作::

SELECT  
    IFNULL(ROUND(AVG(TABLE1.TotalCapacityPercentageUsage / TABLE1.TotalSnapshotsForTimeSegment), 2), 0.0) AS TotalAvgCapacityPercentageUsage,
    IFNULL(ROUND(MAX(TABLE1.MaxCapacityPercentageUsage), 2), 0.0) AS TotalMaxCapacityPercentageUsage,
     -- TODO return the QueuesTmp.QueueName for max calculation (This could be more than one row, so I was going to use something like the following:
     -- (SELECT GROUP_CONCAT(QueuesTmp.QueueName SEPARATOR ' ') to ensure only one field is returned.. 

    FROM TABLE1
    INNER JOIN QueuesTmp ON QueuesTmp.QueueID = TABLE1.QueueID
    RIGHT JOIN TimesTmp ON TABLE1.TimeSegment = TimesTmp.QuarterHour AND
                           TABLE1.Date = DATE(TimesTmp.StartOfRangeUTC)
    GROUP BY TimesTmp.QuarterHour;

我开始做一个Sub选择,但似乎我必须重复所有的连接,WHERE和Group By(似乎这甚至不可能,因为那是什么)...

有人能指导我如何实现这一目标吗?

提前致谢。

工作解决方案

GROUP_CONCAT(DISTINCT QueuesTmp.QueueName ORDER BY MYCOLUMN DESC                      SEPARATOR':')AS MaxColumnQueueName,

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确。您需要具有最大计算的该行的QueueName。因此,请将group_concat与此计算的ORDER BY一起使用,并使用SUBSTRING_INDEX获取此列表的第一个元素。

substring_index(
    GROUP_CONCAT(DISTINCT QueuesTmp.QueueName ORDER BY `maxCalculation` DESC) SEPARATOR ':',
    ':',
    1
)

其他问题。 抱歉,最后评论空间已达到。这是一个查询。 我用你的例子 - 查询sub并选择queueId作为逗号分隔列表,并选择max(maxColumn)作为附加。 之后,我再次使用queueId和maxColumn加入队列表。我无法保证是否有效。

SELECT 
    sub.TotalAvgCapacityPercentageUsage,
    sub.TotalMaxCapacityPercentageUsage,
    GROUP_CONCAT(DISTINCT QueuesTmp.QueueName ORDER BY MYCOLUMN DESC SEPARATOR ':') AS MaxColumnQueueName
FROM(
    SELECT  
        TimesTmp.QuarterHour,
        IFNULL(
            ROUND(
                AVG(
                    TABLE1.TotalCapacityPercentageUsage / 
                    TABLE1.TotalSnapshotsForTimeSegment
                ), 
                2
            ), 
            0.0
        ) AS TotalAvgCapacityPercentageUsage,
        IFNULL(
            ROUND(
                MAX(TABLE1.MaxCapacityPercentageUsage), 
                2
            ), 
            0.0
       ) AS TotalMaxCapacityPercentageUsage,
       max(QueuesTmp.maxColumn) AS maxColumn,
       group_concat(DISTINCT QueueID) AS QueueID
    FROM TABLE1
    INNER JOIN QueuesTmp 
        ON QueuesTmp.QueueID = TABLE1.QueueID
    RIGHT JOIN TimesTmp 
        ON TABLE1.TimeSegment = TimesTmp.QuarterHour 
        AND TABLE1.Date = DATE(TimesTmp.StartOfRangeUTC)
    GROUP BY TimesTmp.QuarterHour
) AS sub
LEFT JOIN QueuesTmp 
    ON QueuesTmp.QueueID IN(sub.QueueID)
    AND QueuesTmp.maxColumn = sub.maxColumn