![](/img/trans.png)
[英]SQL query for finding latest or max value of timestamp from table corresponding to N ids Timescaledb
[英]SQL Query in finding out the max number from a table with Null value
我该如何解决这个要求。 请帮忙。
客户表-CT
ClientID Balance
123 10
123 20
123 30
123 40
124 50
124 60
124 Null
我想从CT表中找到我们的max(Balance)。
条件->如果没有null值,那么我必须找出max(Balance),否则应该为Null。 看到下面的结果,这是期望的。
ClientID Balance
123 40
124 Null
正在编写查询,如下所示。 但是还有其他动态的方法吗?
Select ClientID,
CASE WHEN MIN(Balance) = NULL THEN
NULL
ELSE
MAX(Balance) END AS 'MaxBalance'
From CT
Group by clientID
请让我知道,还有其他选择吗?
尝试这个:
Select ClientID,
(CASE WHEN count(balance) < count(*)
THEN NULL
ELSE MAX(Balance)
END) AS MaxBalance
From CT
Group by clientID
或者,更麻烦一些,但也许更清楚:
Select ClientID,
(CASE WHEN sum(case when balance is null then 1 else 0 end) > 0
THEN NULL
ELSE MAX(Balance)
END) AS MaxBalance
From CT
Group by clientID
怎么样:
SELECT clientid
, balance
FROM
(
SELECT clientid
, balance
, row_number()
over( partition by clientid
order by CASE WHEN balance IS NULL THEN 0 ELSE 1 END
, balance DESC
) r
FROM ct
) n
WHERE r = 1
我不确定[Balance]是什么数据类型,但是如果它是整数,则可以执行以下操作:
Select ClientID, NULLIF(MAX(ISNULL(Balance,2147483647)),2147483647)
From CT
GROUP BY ClientID
如果[Balance]不是int,只需将2147483647
替换为该数据类型的最大值。
危险当然是如果您确实有一个余额为2147483647的客户。在这种情况下,他们的最大余额将显示为空。
这将适用于SQL 2005+
; WITH a AS (
SELECT DISTINCT ClientID
FROM CT
WHERE Balance IS NULL )
SELECT t.ClientID, MAX(t.Balance) "MaxBalance"
FROM CT t
LEFT JOIN a ON t.CLientID = a.ClientID
WHERE a.ClientID IS NULL
GROUP BY t.CLientID
UNION ALL
SELECT a.ClientID, NULL
FROM a
这可行,但不是很优雅:
SELECT SUB.ClientID, CASE (SELECT COUNT(ClientID)
FROM MyTable MT
WHERE Balance IS NULL
AND MT.ClientID = SUB.ClientID)
WHEN 0 THEN (SELECT MAX(Balance)
FROM MyTable MT
WHERE MT.ClientID = SUB.ClientID)
ELSE NULL END AS Balance
FROM (SELECT ClientID
FROM [MyTable]
GROUP BY ClientID) SUB
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.