我有以下查询:
SELECT
s.nsn,
CAST(ms.msDli AS VARCHAR) + CAST(pe.peDli AS VARCHAR) as dli,
p.engineNo, m.mopNo, sh.carName,
s.qty, s.msdSr, s.msdUr,
(SELECT MAX(s.Qty) FROM spares s) MaxQuantity
FROM
spares s, mop m, pms p, car sh, subEquipment sub, mainSystem ms, parentEquipment pe, car_parentEquipment spe
WHERE
s.mopId = m.mopId
AND m.pmsId = p.pmsId
AND p.subId = sub.subId
AND sub.peId = pe.peId
AND sub.shId = sh.shId
AND pe.peId = spe.peId
AND spe.shId = sh.shId
AND pe.msId = ms.msId
ORDER BY
s.demandDate DESC, s.nsn
返回结果如下:
nsn dli engineNo mopNo carName qty msdSr msdUr MaxQuantity
098 58011 235 235 TOYOTA 50 98 98 897
235 58011 235 235 TOYOTA 12 25 235 897
098 55511 98 987 COROLLA 98 98 908 897
897 58011 235 235 TOYOTA 23 897 897 897
我想要的是根据第一列即 NSN
这样所有具有相似 NSN 的汽车一起显示,最后一列显示最大数量(是 qty.
列中的最大值:
例如在上面的例子中,结果应该是这样的:
nsn dli engineNo mopNo carName qty msdSr msdUr MaxQuantity
098 58011 235 235 TOYOTA 98 98 98 98
098 55511 98 987 COROLLA 50 98 908 98
235 58011 235 235 TOYOTA 235 25 235 12
897 58011 235 235 TOYOTA 897 897 897 23
我不想要 Group By
解决方案,因为它会要求我将所有列包含在 group by 或 aggregate 子句中,并且无法理解那一团糟,请帮我解决带有子查询的问题或者如果可能的话加入?
应用 Gordon Linoff 解决方案
with t as (
SELECT
s.nsn,
CAST(ms.msDli AS VARCHAR) + CAST(pe.peDli AS VARCHAR) as dli,
p.engineNo, m.mopNo, sh.carName,
s.qty, s.msdSr, s.msdUr,
(SELECT MAX(s.Qty) FROM spares s) MaxQuantity
FROM
spares s, mop m, pms p, car sh, subEquipment sub, mainSystem ms, parentEquipment pe, car_parentEquipment spe
WHERE
s.mopId = m.mopId
AND m.pmsId = p.pmsId
AND p.subId = sub.subId
AND sub.peId = pe.peId
AND sub.shId = sh.shId
AND pe.peId = spe.peId
AND spe.shId = sh.shId
AND pe.msId = ms.msId
ORDER BY
s.demandDate DESC, s.nsn)
select t.*, max(qty) over (partition by nsn) as MaxQuantity
from t
order by nsn;
最佳答案
听起来您想要窗口函数 max() over
。这将获得每个组的最大值,但是,它不是对值进行分组,而是将值附加到每一行:
with t as (your query here)
select t.*, max(qty) over (partition by nsn) as MaxQuantity
from t
order by nsn;
关于sql - 在不使用 group by 子句的情况下按列对结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789109/