为数组中的所有 id 选择列上具有最大值的所有行
Posted
技术标签:
【中文标题】为数组中的所有 id 选择列上具有最大值的所有行【英文标题】:Select all rows with max value on a column for all the id in array 【发布时间】:2019-12-19 19:46:36 【问题描述】:我的列有以下表格标记:
LOC(Blob)
LOCDTL
LOCTIME
CARRIERTYPE
CARRIERID
我想在查询本身的数组中获取与来自前端的每个 id 的 MAX(LOCTIME) 值对应的行。
我已经尝试过这种可能性,但没有一种能按我想要的方式工作。
SELECT X(LOC), Y(LOC), LOCDTL, LOCTIME, UPPER(CARRIERTYPE), CARRIERID
FROM LOC_EVENT_CARRIER_REPO
WHERE UPPER(TRIM(CARRIERTYPE)) = "VESSEL"
AND UPPER(TRIM(CARRIERID)) IN (35, 69,70,71,72,73,74)
AND LOCTIME IN (SELECT MAX(LOCTIME) FROM LOC_EVENT_CARRIER_REPO
WHERE UPPER(CARRIERTYPE) = "VESSEL"
AND CARRIERID IN (35, 69,70,71,72,73,74))
group by CARRIERID;
【问题讨论】:
你的查询是怎么不起作用的? 【参考方案1】:如果我做对了。找到最后一行,MAX(LOCTIME)
对应于提供的 id 列表中的每个 CARRIERID
SELECT X(LOC), Y(LOC), LOCDTL, LOCTIME, UPPER(CARRIERTYPE), CARRIERID
FROM LOC_EVENT_CARRIER_REPO e
JOIN (
SELECT CARRIERID, MAX(LOCTIME) maxlt
FROM LOC_EVENT_CARRIER_REPO
WHERE UPPER(CARRIERTYPE) = "VESSEL"
AND CARRIERID IN (35, 69,70,71,72,73,74)
GROUP BY CARRIERID
) m ON e.CARRIERID = m.CARRIERID AND e.LOCTIME = m.maxlt
【讨论】:
【参考方案2】:如果我理解正确,您只需要一个相关子句而不是子查询中的GROUP BY
:
SELECT X(LECR.LOC), Y(LECR.LOC), LECR.LOCDTL,
LECR.LOCTIME, UPPER(LECR.CARRIERTYPE), LECR.CARRIERID
FROM LOC_EVENT_CARRIER_REPO LECR
WHERE UPPER(TRIM(LECR.CARRIERTYPE)) = 'VESSEL' AND
LECR.CARRIERID IN (35, 69, 70, 71, 72, 73, 74) AND
LECR.LOCTIME IN (SELECT MAX(LECR2.LOCTIME)
FROM LOC_EVENT_CARRIER_REPO LECR2
WHERE UPPER(TRIM(LECR2.CARRIERTYPE)) = UPPER(TRIM(LECR.CARRIERTYPE)) AND
LECR2.CARRIERID = LECR.CARRIERID
);
您的版本与所有运营商的最长时间匹配,而不仅仅是逐个运营商。
注意事项:
在维护良好的数据库中,类型值不需要UPPER(TRIM())
。
您绝对不会在数值上使用UPPER(TRIM())
,而CARRIERID
看起来是数字。
假设没有重复的时间值,则不需要外部GROUP BY
。
表别名使查询更易于编写和阅读。
您应该限定具有多个表引用的查询中的所有列引用。
【讨论】:
以上是关于为数组中的所有 id 选择列上具有最大值的所有行的主要内容,如果未能解决你的问题,请参考以下文章