【问题标题】:How to get max row from table如何从表中获取最大行数
【发布时间】:2010-04-19 00:53:20
【问题描述】:

我有以下代码和一个大问题:

WITH CALC1 AS (
SELECT OTQUOT, OTIT01 AS ITEMS, ROUND(OQCQ01 * OVRC01,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT01 <> ''

UNION ALL

SELECT OTQUOT, OTIT02 AS ITEMS, ROUND(OQCQ02 * OVRC02,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT02 <> ''

UNION ALL

SELECT OTQUOT, OTIT03 AS ITEMS, ROUND(OQCQ03 * OVRC03,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT03 <> ''

UNION ALL

SELECT OTQUOT, OTIT04 AS ITEMS, ROUND(OQCQ04 * OVRC04,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT04 <> ''

UNION ALL

SELECT OTQUOT, OTIT05 AS ITEMS, ROUND(OQCQ05 * OVRC05,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT05 <> ''

ORDER BY OTQUOT ASC
)

SELECT OTQUOT, ITEMS, MAX(COST)
FROM CALC1
WHERE OTQUOT = '04886471'
GROUP BY OTQUOT, ITEMS

结果:

 04886471 FEPO5050WCGA24 13.21
 04886471 GFRK1650SGL 36.21
 04886471 FRA7500GA 12.6
 04886471 CGIFESHAZ 11.02
 04886471 CGIFESHPDPR 11.79
 04886471 GFRK1350DBL 68.23
 04886471 RET1.63825GP 32.55
 04886471 FRSA 0.12
 04886471 GFRK1350SGL 55.94
 04886471 GFRK1650DBL 71.89
 04886471 FEPO6565WCGA24 16.6
 04886471 PCAP5050GA 0.28
 04886471 FEPO6565NCPAG24 0.000000

如何获取具有最高值的 Itemcode 的行的结果? 在这种情况下,我需要结果: 04886471 GFRK1650DBL 71.89 但我不知道如何更改我的代码来获得它 - 任何人都可以帮助我吗?

【问题讨论】:

  • 您的问题似乎已得到解答,因此请将两个答案之一标记为已接受(单击答案左侧的灰色复选标记)

标签: sql tsql select max


【解决方案1】:

使用ROW_NUMBER() 窗口函数提供一种选择顶行的方法。请注意,您需要将其放入派生子查询中,因为 WHERE 子句无法引用查询自己的行号。你必须通过外部查询来做到这一点:

WITH ( ...your UNION query... )
SELECT *
FROM (
  SELECT OTQUOT, ITEMS, COST, ROW_NUMBER() OVER (ORDER BY COST DESC) AS RN
  FROM CALC1
  WHERE OTQUOT = '04886471'
) T
WHERE T.RN = 1;

我也不会在你的 UNION 查询中使用 ORDER BY

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,添加 ORDER BY COST DESC LIMIT 1 应该可以解决问题。

    编辑:如果评论表明您的 SQL 引擎不支持 LIMIT,请参阅 this post 了解如何使用 Microsoft SQL Server 模拟 LIMIT(它也适用于其他 SQL兼容引擎,例如 Oracle、PostgreSQL 或 DB2,因为它只使用 SQL 标准结构)。

    【讨论】:

    • LIMIT 被 MySQL、SQLite 和 PostgreSQL 支持,但是在这三个中,只有 PostgreSQL 支持表表达式的WITH 语法。我猜@Odette 使用的是 Oracle 或 Microsoft。
    • @Bill,谢谢,我在一篇文章中添加了一个指针,该文章展示了如何在没有 LIMIT 子句的 SQL 兼容引擎上执行此操作(基本上归结为,与您的答案相同,当然;-)。
    • 谢谢谢谢谢谢!它现在可以工作了——你们是最棒的
    • 我不知道,也许我做了不正确的假设。 @Odette 在另一个问题中说它是 MySQL。但这没有意义,因为 MySQL 不支持 WITHROW_NUMBER()
    • 会不会是 MySQL、MaxDB 的老产品?这确实是一个 SAP 数据库,看起来更像 Oracle 而不是 MySQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多