Ste*_*son 52 sql null group-by
我有一个有processed_timestamp列的表- 如果已经处理了一个记录,那么该字段包含它被处理的日期时间,否则它是null.
我想写一个返回两行的查询:
NULL xx -- count of records with null timestamps
NOT NULL yy -- count of records with non-null timestamps
Run Code Online (Sandbox Code Playgroud)
那可能吗?
更新:表格非常大,因此效率非常重要.我可以运行两个查询来分别计算每个总数,但是如果我可以避免它,我想避免两次击中表.
Ste*_*rig 43
在MySQL中你可以做类似的事情
SELECT
IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield,
COUNT(*)
FROM mytable
GROUP BY myfield
Run Code Online (Sandbox Code Playgroud)
Tom*_*lak 39
在T-SQL(MS SQL Server)中,这适用于:
SELECT
CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END FieldContent,
COUNT(*) FieldCount
FROM
TheTable
GROUP BY
CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 21
尝试以下,它是供应商中立的:
select
'null ' as type,
count(*) as quant
from tbl
where tmstmp is null
union all
select
'not null' as type,
count(*) as quant
from tbl
where tmstmp is not null
Run Code Online (Sandbox Code Playgroud)
让我们的本地DB2专家看一下之后,他同意:迄今为止所提出的解决方案(包括这一个)都没有一个完整的表扫描(如果时间戳没有被索引,那么表中的表,或者索引也是如此).它们都扫描表中的每个记录一次.
所有CASE/IF/NVL2()解决方案都为每一行执行空到字符串转换,从而在DBMS上引入了不必要的负载.这个解决方案没有那个问题.
如果它是oracle那么你可以这样做:
select decode(field,NULL,'NULL','NOT NULL'), count(*)
from table
group by decode(field,NULL,'NULL','NOT NULL');
Run Code Online (Sandbox Code Playgroud)
我确信其他数据库允许类似的技巧.
小智 5
斯图尔特
也许考虑这个解决方案 它(也是!)供应商非特定.
SELECT count([processed_timestamp]) AS notnullrows,
count(*) - count([processed_timestamp]) AS nullrows
FROM table
Run Code Online (Sandbox Code Playgroud)
至于效率,这可以通过在一行中包含结果来避免2x索引搜索/表扫描/任何事情.如果在结果中绝对需要2行,那么由于联合聚合,对该集合的两次传递可能是不可避免的.
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
42903 次 |
| 最近记录: |