MYSQL分组依据,其值> 0

时间:2018-11-08 04:57:34

标签: mysql

我一直在处理此查询,并且由于按p.ID进行分组,因此按预期工作,即按p.ID显示一个输出(因为没有分组的情况下会有多个p.ID值。)但是,根据p.ID,有时我会得到一个e.alternateEventDurationInMilliseconds值,而不是最快的e.alternateEventDurationInMilliseconds。

有没有办法我仍然可以使用GROUP BY p.ID,但是只要持续时间仍然> 0,就可以添加检查以获取最小的e.alternateEventDurationInMilliseconds?否则,默认情况下会给我一个大于0的随机值,但我想具体获得大于0的最小持续时间,每个p.ID仅一行。

谢谢! :)

SELECT
    p.ID,
    e.personaId,
    e.EVENTID,
    e.alternateEventDurationInMilliseconds                  
FROM
    EVENT_DATA e
INNER JOIN
    PERSONA p ON e.personaId = p.ID
WHERE
    e.EVENTID = '43' AND e.alternateEventDurationInMilliseconds > '0'
GROUP BY
    p.ID
ORDER BY
    e.`alternateEventDurationInMilliseconds` ASC

3 个答案:

答案 0 :(得分:1)

您必须在子查询中创建一个新表,然后再加入该表。

此查询将为您提供您要查找的e.id和min(但不为零)数据:

select id, personalID, EVENTID,
min(alternateEventDurationInMilliseconds) as mill,
from EVENT_DATA
 where alternateEventDurationInMilliseconds > 0
 and e.EVENTID=43
 group by personaId;

因此,您应该将由子查询创建的表用作联接表,而不是联接到EVENT_DATE,例如:

join ( select id, personalID, e.EVENTID,
min(alternateEventDurationInMilliseconds) as mill,
from EVENT_DATA
 where alternateEventDurationInMilliseconds > 0
 and e.EVENTID=43
 group by personaId ) e...

我认为应该可以。

这也许也可以,但是我不确定-只需接受您以前的查询,然后将e.alternateEventDurationInMilliseconds更改为“ min(e.alternateEventDurationInMilliseconds),如e.alternateEventDurationInMilliseconds”即可。

答案 1 :(得分:1)

分组后,必须使用MIN()聚合函数来选择每个组的(特定列的)最小值。另外,如果仅从该表中检索PERSONA,但此ID已经是表ID的一部分(在列EVENT_DATA上,为什么需要联接表personaId )。您可能需要的查询是以下查询:

SELECT
    p.ID,
    MIN(e.personaId), -- This could be replaced by ANY_VALUE(e.personaId).
    MIN(e.EVENTID), -- This could be replaced by ANY_VALUE(e.EVENTID).
    MIN(e.alternateEventDurationInMilliseconds) AS minAlternateEventDurationInMilliseconds
FROM
    EVENT_DATA e
INNER JOIN
    PERSONA p ON e.personaId = p.ID
WHERE
    e.EVENTID = '43' AND e.alternateEventDurationInMilliseconds > 0
GROUP BY
    p.ID
ORDER BY
    minAlternateEventDurationInMilliseconds ASC

如果您不需要表PERSONA中的其他数据(ID除外),则先前的查询可以简化为:

SELECT
    MIN(e.personaId), -- This could be replaced by ANY_VALUE(e.personaId).
    MIN(e.EVENTID), -- This could be replaced by ANY_VALUE(e.EVENTID).
    MIN(e.alternateEventDurationInMilliseconds) AS minAlternateEventDurationInMilliseconds
FROM
    EVENT_DATA e
WHERE
    e.EVENTID = '43' AND e.alternateEventDurationInMilliseconds > 0
GROUP BY
    e.personaId
ORDER BY
    minAlternateEventDurationInMilliseconds ASC

答案 2 :(得分:0)

您可以使用此命令:(假设使用mysql)

SELECT p.ID, e.alternateEventDurationInMilliseconds from persona p
join (select min(alternateEventDurationInMilliseconds) as alternateEventDurationInMilliseconds, personaid
from event_data where personaid = '43' and alternateEventDurationInMilliseconds > 0 
group by personaid) as e on e.personaid = p.Id;

这是一个著名的问题:

The Rows Holding the Group-wise Maximum of a Certain Column