我一直在处理此查询,并且由于按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
答案 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;
这是一个著名的问题: