sql - 将 NULL 视为最大可能值

标签 sql sql-server null aggregate-functions

我想获取根据Code分组的交易数量最大的行。

CREATE TABLE SaleOrder
(
    TransactionNo Int,
    SaleOrderDate DATE,
    Code VARCHAR(25),
    Quantity INT,
    TotalAmount Numeric(18,2),
    Remarks VARCHAR(25)
)

INSERT INTO SaleOrder VALUES (NULL, '2018-10-01', 'SO-001-OCT-18',  6, 2500, 'Hello');
INSERT INTO SaleOrder VALUES (1,    '2018-10-01', 'SO-001-OCT-18',  8, 2600, 'Hello');
INSERT INTO SaleOrder VALUES (2,    '2018-10-01', 'SO-001-OCT-18', 12, 3400, 'Hello');
INSERT INTO SaleOrder VALUES (3,    '2018-10-01', 'SO-001-OCT-18',  9, 2900, 'Hello');
INSERT INTO SaleOrder VALUES (4,    '2018-10-01', 'SO-001-OCT-18',  2,  900, 'Hello');
INSERT INTO SaleOrder VALUES (NULL, '2018-10-01', 'SO-002-OCT-18',  6, 2500, 'Hello');
INSERT INTO SaleOrder VALUES (NULL, '2018-10-01', 'SO-003-OCT-18',  6, 2500, 'Hello');
INSERT INTO SaleOrder VALUES (0,    '2018-10-01', 'SO-004-OCT-18',  6, 2500, 'Hello');


SELECT * FROM SaleOrder O
WHERE TransactionNo  = (SELECT MAX(ISNULL(TransactionNo, 1)) FROM SaleOrder GROUP BY Code)

这里,当 TransactionNo 为 NULL 时,它不会返回任何记录,而它也应该返回该记录。

最佳答案

绝对没有理由将 NULL 视为最大可能值。您始终可以使用ROW_NUMBER技巧:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Code ORDER BY TransactionNo DESC) AS RN
    FROM SaleOrder
)
SELECT * FROM cte
WHERE RN = 1

结果:

| TransactionNo | SaleOrderDate | Code          | Quantity | TotalAmount | Remarks | RN |
|---------------|---------------|---------------|----------|-------------|---------|----|
| 4             | 2018-10-01    | SO-001-OCT-18 | 2        | 900.00      | Hello   | 1  |
| NULL          | 2018-10-01    | SO-002-OCT-18 | 6        | 2500.00     | Hello   | 1  |
| NULL          | 2018-10-01    | SO-003-OCT-18 | 6        | 2500.00     | Hello   | 1  |
| 0             | 2018-10-01    | SO-004-OCT-18 | 6        | 2500.00     | Hello   | 1  |

关于sql - 将 NULL 视为最大可能值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664190/

相关文章:

c# - HttpServerUtility.UrlTokenDecode 似乎只返回 null

mysql - MySQL 中的内部连接

sql - 将存储过程的结果保存在表变量中

php - 仅当姓氏不唯一时才显示名字

C# MSSQL base64 插入和选择。数据不同

sql - 根据他们在 SQL Server 中的成就显示名称

MySQL从另一个表中获取数据,其中列行与第一个表中的行结果匹配

java - 检查 Java 中形式参数是否为 Null

mysql - 插入新表时计算年龄

c# - 数据适配器和空值