Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果表中没有特定日期的数据,是否返回0或Null值?_Sql_Postgresql - Fatal编程技术网

Sql 如果表中没有特定日期的数据,是否返回0或Null值?

Sql 如果表中没有特定日期的数据,是否返回0或Null值?,sql,postgresql,Sql,Postgresql,我有一个数据库应用程序,它存储特定类型仪表的一系列读数 假设单个仪表在特定日期没有读数。然后我查询一个日期范围内的仪表。该特定日期将没有任何信息,这会在显示的输出中留下空白 所以我的问题是如何为丢失的日期返回0值。例如,当仪表没有2019-0702和2019-0703的数据时,考虑此代码。我希望得到如示例输出中所示的零,而不是显示数据中的间隙 选择m.sdate, n、 仪表编号, coalesccastn.meter_数为CHAR,0为_个案例的_数, 当n.count为空时,则为“0”,否则

我有一个数据库应用程序,它存储特定类型仪表的一系列读数

假设单个仪表在特定日期没有读数。然后我查询一个日期范围内的仪表。该特定日期将没有任何信息,这会在显示的输出中留下空白

所以我的问题是如何为丢失的日期返回0值。例如,当仪表没有2019-0702和2019-0703的数据时,考虑此代码。我希望得到如示例输出中所示的零,而不是显示数据中的间隙

选择m.sdate, n、 仪表编号, coalesccastn.meter_数为CHAR,0为_个案例的_数, 当n.count为空时,则为“0”,否则n.count结束计数 从…起 选择datedates作为sdate 从生成_序列 将“2019-07-01”转换为时间戳, 将“2019-07-08”转换为时间戳, 间隔“1天” 作为日期 M 左连接 选择仪表编号, 日期读取时间为rdate, 计数*从仪表_数据.x 其中dateread_时间介于“2019-07-01”和“2019-07-08”之间 和“92589492”中的仪表号 按仪表编号、日期读取时间分组 N 在m.sdate=n.rdate;
对您可以在中使用的数据结构进行一些假设,使用更简洁的语法将有效。诀窍是首先对您感兴趣的日期和仪表号进行交叉连接,这实际上会创建一个空矩阵,然后将仪表U数据的所有相关行左连接到适当的矩阵单元格,最后使用COUNT进行聚合,或者简单地说,您可以求和、平均或最小或最大

在这段代码中,我使用从meter_数据中选择不同的meter_编号来获得我认为我们可能感兴趣的仪表编号列表:

select to_char(d,'YYYY-MM-DD'), mn.meter_number, count(meter_data.*)
from 
    generate_series ('2019-07-01'::date, '2019-07-06'::date, '1 day') d
    cross join 
    (select distinct meter_number from meter_data) mn
left join meter_data on meter_data.read_time=d and mn.meter_number=meter_data.meter_number
group by d, mn.meter_number
order by mn.meter_number, d;
如果只想查找单个仪表号,可以通过几种方式将其插入查询中,例如,用SELECT 92589492 as meter_number替换子查询:


试试看:

对数据的结构做一些假设,你可以在中使用,一个更简洁的语法会起作用。诀窍是首先对您感兴趣的日期和仪表号进行交叉连接,这实际上会创建一个空矩阵,然后将仪表U数据的所有相关行左连接到适当的矩阵单元格,最后使用COUNT进行聚合,或者简单地说,您可以求和、平均或最小或最大

在这段代码中,我使用从meter_数据中选择不同的meter_编号来获得我认为我们可能感兴趣的仪表编号列表:

select to_char(d,'YYYY-MM-DD'), mn.meter_number, count(meter_data.*)
from 
    generate_series ('2019-07-01'::date, '2019-07-06'::date, '1 day') d
    cross join 
    (select distinct meter_number from meter_data) mn
left join meter_data on meter_data.read_time=d and mn.meter_number=meter_data.meter_number
group by d, mn.meter_number
order by mn.meter_number, d;
如果只想查找单个仪表号,可以通过几种方式将其插入查询中,例如,用SELECT 92589492 as meter_number替换子查询:


试试看:

你已经得到了比我所能提供的更聪明的答案,但是关于COALESCE的一些东西吸引了我的注意。如果你没有结果,联合什么都不做。合并需要对行进行操作,所以若并没有结果,就不能用简单的合并语句综合生成一个结果。下面是一个简单的示例,其中没有ID为1的行:

-你什么也得不到,因为没有什么可以联合起来反对的

select coalesce(foo,'Undefined') from bar where id = 1;
-因为coalesce在这里工作,所以没有定义。嵌套查询返回NULL,它成为合并的第一个参数。因为它是NULL,第二个参数是'Undefined',所以返回一行'Undefined'

select coalesce(
        (select foo from bar where id = 1),
        'Undefined')

你已经得到了比我能提供的更聪明的答案,但是关于联合的一些东西吸引了我的注意。如果你没有结果,联合什么都不做。合并需要对行进行操作,所以若并没有结果,就不能用简单的合并语句综合生成一个结果。下面是一个简单的示例,其中没有ID为1的行:

-你什么也得不到,因为没有什么可以联合起来反对的

select coalesce(foo,'Undefined') from bar where id = 1;
-因为coalesce在这里工作,所以没有定义。嵌套查询返回NULL,它成为合并的第一个参数。因为它是NULL,第二个参数是'Undefined',所以返回一行'Undefined'

select coalesce(
        (select foo from bar where id = 1),
        'Undefined')

我得到了我的解决方案。首先,我生成日期序列,并与作为varchar传递的meterno交叉联接。我使用regexp\u split\u to\u table函数以行方式显示传递的meterno,然后与date交叉联接

请检查我的解决方案

选择m.sdate,合并m.meterno,METERU编号, 当n.count为空时,则为“0”,否则n.count结束计数 从…起 选择日期为sdate,mn.meterno 从generate_系列将“2019-07-01”作为时间戳,将“2019-07-06”作为时间戳,间隔为“1天” 交叉连接选择regexp_split_到_表'92590714_92590130_92589492_92590381','uu'作为meterno mnm 左连接 从meter_data.load_survey中选择meter_编号、dateread_time作为rdate、COUNT* 其中,dateread_时间介于“2019-07-01”和“2019-07-06”之间,仪表编号在“92590714”中, '92590130','92589492','92590381' 按仪表编号分组,日期读取时间n 在m.sdate=n.rdate和m.meterno=n.meter\u编号上
按m.sdate、m.meterno、n.count分组我得到了我的解决方案。首先,我生成日期序列,并与作为varchar传递的meterno交叉联接。我使用regexp_split_to_table函数以行方式显示传递的meterno,然后与日期交叉联接

请检查我的解决方案

选择m.sdate,合并m.meterno,METERU编号, 当n.count为空时,则为“0”,否则n.count结束计数 从…起 选择日期为sdate,mn.meterno 从generate_系列将“2019-07-01”作为时间戳,将“2019-07-06”作为时间戳,间隔为“1天” 交叉连接选择regexp_split_到_表'92590714_92590130_92589492_92590381','uu'作为meterno mnm 左连接 从meter_data.load_survey中选择meter_编号、dateread_time作为rdate、COUNT* 其中dateread_时间介于“2019-07-01”和“2019-07-06”之间,仪表编号位于“92590714”、“92590130”、“92589492”、“92590381” 按仪表编号分组,日期读取时间n 在m.sdate=n.rdate和m.meterno=n.meter\u编号上
按m.sdate、m.meterno、n.count分组

请不要在问题中添加不必要的标签。这个问题与设计数据库或数据库管理无关,也不需要这些标记中的任何一个。如果您将鼠标悬停在标记上,您可以看到它们的描述以及它们的相关位置。我不清楚您的问题是什么。因为我们没有样本数据,所以没有机会验证您的查询。但是没有这一点:使用generate_series是正确的方法。表的结构是什么?当前的输出有什么问题?乍一看,前5行似乎是不必要的,您只需要在第一个SELECT子句中添加COALESCECOUNT*。请不要在您的问题中添加不必要的标记。这个问题与设计数据库或数据库管理无关,也不需要这些标记中的任何一个。如果您将鼠标悬停在标记上,您可以看到它们的描述以及它们的相关位置。我不清楚您的问题是什么。因为我们没有样本数据,所以没有机会验证您的查询。但是没有这一点:使用generate_series是正确的方法。表的结构是什么?当前的输出有什么问题?乍一看,前5行似乎是不必要的,您只需要将COALESCECOUNT*添加到第一个SELECT子句中。