目录 获取每月最新一条数据及case when的使用,以及其他(数据类型转换、分页)等使用 - postgresql根据月份分组、创建时间排序,获取排序后的第一条数据。即获取每月最新一条数据
postgresql手册中记录了所有的操作命令级函数,具体可点击下面链接地址查看。
postgresql 手册地址:地址链接
PARTITioN BY 分组字段
ORDER BY 排序字段
WHERE s.rn = 1 获取分组排序后的第一条数据
比如数据按月分组,然后按创建时间倒序排序,再获取第一条数据,即获取每月最新的一条数据。
select s.* from (select t.*, row_number() OVER (PARTITION by t.filling_month ORDER BY t.create_time desc) as rows from test t) s where s.rows = 1
generate_series 是以步长为节点拆分时间(格式:generate_series(‘startDate’, ‘endDate’, ‘拆分步长’)),INTERVAL为日期计算,在INTERVAL前加计算符号,后跟要计算加或减的日期。
SELECT concat( EXTRACT ( month from to_date(calendars.mon, 'yyyy-mm')), '月') mons, social_3.alarms_num AS monthCount FROM ( SELECT to_char( months, 'yyyy-mm' ) mon FROM generate_series ( now( ) - interval '11 mon', now( ), '1mon' ) months ) calendars left join( select s.* from (select t.*, row_number() OVER (PARTITION by t.filling_month ORDER BY t.create_time desc) rn from gemp_social_security t) s where s.rn = 1 ) social_3 on calendars.mon = social_3.filling_month order by calendars.mon
##查询当前往前12个月的年月日期SELECT to_char( months, 'yyyy-mm' ) mon FROM generate_series ( now( ) - INTERVAL '11 mon', now( ), '1mon' ) months ##查询当前往前30天的日期 SELECT to_char( months, 'yyyy-mm-dd' ) mon FROM generate_series ( now( ) - INTERVAL '30 day', now( ), '1day' ) months
查询结果如下:
SELECTconcat ( EXTRACT ( MONTH FROM to_date( calendars.mon, 'yyyy-mm' ) ), '月' ) mon,COALESCE ( d.num, 0 ) AS num FROM( SELECT to_char( months, 'yyyy-mm' ) mon FROM generate_series ( now( ) - INTERVAL '11 mon', now( ), '1mon' ) months ) calendarsLEFT JOIN (SELECT COUNT( 1 ) num,SUBSTRING ( jxsj, 0, 8 ) mon FROM"public"."qlb_monitor" WHEREjxsj >= TO_CHAR( ( DATE_TRUNC( 'MONTH', CURRENT_DATE ) - INTERVAL '11 MONTH' ), 'YYYY-MM-DD' ) GROUP BYSUBSTRING ( jxsj, 0, 8 ) ) d ON calendars.mon = d.mon ORDER BYcalendars.mon
SELECT days.days, COUNT(a.id) AS num FROM (SELECT DATE_FORMAT( @date := DATE_ADD(@date, INTERVAL + 1 MONTH), '%Y-%m' ) days FROM (SELECT @date := DATE_ADD((SELECT DATE_FORMAT( (SELECT DATE_SUB( CURDATE(), INTERVAL DAYOFYEAR(NOW()) - 1 DAY )), '%Y-%m-%d' )), INTERVAL - 1 MONTH) FROM `user` LIMIT 12) TIME) AS days LEFT JOIN `test` a ON a.month = days.days GROUP BY days.days
查询结果如下:
case when 是作为条件判断使用的函数,在when后写判断条件,多个判断条件可以用and 或 or 进行连接,每个判断when都会产生一个结果then,在then后加when判断通过后对应的返回结果,返回结果类型需是一个字符串类型的结果,否则会提示异常,else是最后的其他结果,通if条件判断的else相同,返回前面所有判断不通过后的一个返回值,最后需要加上end,表示case when的结束。
SELECT t.traffic_accident AS trafficAccident,(CASEWHEN t.traffic_accident_ratio = 0 THEN '0%' WHEN t.traffic_accident_ratio < 0 THEN concat ( t.traffic_accident_ratio, '%' ) ELSE concat ( '+', t.traffic_accident_ratio, '%' ) END ) AS trafficAccidentRatio,concat ( t.injured_ratio, '%' ) AS injuredRatio,t.commonly_accident AS commonlyAccident,concat ( t.loss_ratio, '%' ) AS lossRatio,t.serious_accident AS seriousAccident FROMgemp_social_security t WHEREt.filling_month = '2022-12' ORDER BYt.create_time DESC LIMIT 1
MySQL
MySQL提供了ifnull(字段,‘0’) 函数,如果字段值为null,则返回第二个参数值,同时也提供了if(a > b, ‘a’, ‘b’)函数,条件判断a > b 条件返回true,则返回第二个参数值,否则返回第三个参数值。
postgresql
postgresql同样提供了类似的函数,COALESCE(字段, ‘0’)如果字段值为null,则返回第二个参数值。同样可以使用上面的case - when进行条件判断做相应的返回值处理。
#将字段转为字符类型select cast(t.num as varchar) as num from user;#将字段转为数字类型select cast(t.num as numeric) as num from user;
LIMIT和OFFSET允许你只检索查询剩余部分产生的行的一部分;分页使用limit 表示返回查询结果的条数,offset 表示跳过多少条。两个关键字可以单独使用,也可以组合使用,单独使用limit表示返回查询结果的固定条数,单独使用offset表示跳过查询结果的固定条数,然后返回剩余的结果。组合使用如下:表示跳过4条,返回查询结果的4条记录。
select * from user limit 4 offset 4;
select id,name from table_name order by case when(name='张三' or name='李四') then 0 else 1 end, id desc
select row_number() over (order by pre desc) as rows, id, name from user ;
##这里根据“,”分割select unnest(string_to_array('张三,李四,王五',',')) as name;
物理视图与普通视图的区别是物理视图可以创建索引;
--创建物理视图CREATE MATERIALIZED VIEW "public"."table_view"ASselect id,name,user_nofrom user;--给物理视图创建唯一性索引 id是视图索引字段CREATE UNIQUE INDEX "index_id" ON "public"."table_view" USING btree ( "id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST);
出现此问题是因为数据中的时间是24小时制,查询默认用的是12小时制,导致时间字段超出限制。
只需要将日期字段查询换成查24小时制即可。
如:
select to_timestamp(create_time, 'yyyy-mm-dd hh24:mi:ss') as creat_time from user;
--查看现有触发器select * from pg_trigger;--创建一个触发器 当表system_user表数据变动的时候自动触发更新 user_materialized_view 物化视图数据,函数在后面有写create trigger tri_user_analasisafter insert or update or delete on system_userfor each statement execute procedure user_analasis_func();
--创建一个函数CREATE OR REPLACE FUNCTION "public"."user_analasis_func"() RETURNS "pg_catalog"."trigger" AS $BODY$ declarebegin refresh materialized view concurrently user_materialized_view with data; return null; end; $BODY$ LANGUAGE plpgsql VOLATILE COST 100
来源地址:https://blog.csdn.net/zf_csdn123/article/details/128527816
--结束END--
本文标题: 按月、日统计查询数据SQL、以及case when的使用 -- postgresql、MySQL
本文链接: https://lsjlt.com/news/390723.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0