Sql 如果表中没有特定日期的数据,是否返回0或Null值?
我有一个数据库应用程序,它存储特定类型仪表的一系列读数 假设单个仪表在特定日期没有读数。然后我查询一个日期范围内的仪表。该特定日期将没有任何信息,这会在显示的输出中留下空白 所以我的问题是如何为丢失的日期返回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;Sql 如果表中没有特定日期的数据,是否返回0或Null值?,sql,postgresql,Sql,Postgresql,我有一个数据库应用程序,它存储特定类型仪表的一系列读数 假设单个仪表在特定日期没有读数。然后我查询一个日期范围内的仪表。该特定日期将没有任何信息,这会在显示的输出中留下空白 所以我的问题是如何为丢失的日期返回0值。例如,当仪表没有2019-0702和2019-0703的数据时,考虑此代码。我希望得到如示例输出中所示的零,而不是显示数据中的间隙 选择m.sdate, n、 仪表编号, coalesccastn.meter_数为CHAR,0为_个案例的_数, 当n.count为空时,则为“0”,否则
对您可以在中使用的数据结构进行一些假设,使用更简洁的语法将有效。诀窍是首先对您感兴趣的日期和仪表号进行交叉连接,这实际上会创建一个空矩阵,然后将仪表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子句中。