作为一名程序员,相信你对sql并不陌生。 如果你对sql不了解,我们先了解SQL是什么? sql一般指结构化查询语言。结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 佩服那些能把sql写得高效,写得如此行云流水。 下面这条sql是一位经验丰富的数仓工程师编写的。不仅包含了临时表、左连接、内连接、groupby、orderby、聚合函数等。编写得很规范,是一个不错的例子。with活动信息taskinfoas(selectidastaskid,starttime,if(limittype0,endtime,fromunixtime(unixtimestamp(endtime)tasklimitday243600,yyyyMMddHH:mm:ss))asendtime,regexpreplace(substr(starttime,1,10),,)asstartdt,if(limittype0,fromunixtime(unixtimestamp(endtime),yyyyMMdd),fromunixtime(unixtimestamp(endtime)tasklimitday243600,yyyyMMdd))asenddtfromtbtaskwherecategory0andisvalid1andisdelete0)每天任务列表,tasklistdayas(selectdt,taskid,starttime,endtime,startdt,enddtfromtaskinfoajoin(selecta。pdayasdtfromdimdayajointaskinfobon11wherea。pdayb。startdtanda。pdayb。enddt)bon11)每天用户访问明细,taskvisitdetailas(selectdt,taskid,starttime,endtime,userid,if(dtfirstvisitdt,1,0)asisfirstvisitdayfrom(selecta。dt,b。taskid,b。starttime,b。endtime,a。userid,min(a。dt)over(partitionbyb。taskid,a。userid)asfirstvisitdtfromtbuserbehaviorajointasklistdaybona。dtb。dtwherea。eventPageViewanda。useridisnotnullanda。operationtimeb。starttimeanda。operationtimeb。endtimegroupbya。dt,b。taskid,b。starttime,b。endtime,a。userid)a)用户领取任务,taskreceiveas(selecta。taskid,userid,regexpreplace(substr(receivetime,1,10),,)asreceivedtfromtbtaskreceiveajointaskinfobona。taskidb。taskidwherea。isvalid1ora。isdelete0)selecta。taskidas任务编号,starttimeas任务开始时间,endtimeas任务结束时间,a。dtas日期,count(a。userid)as访问人数,sum(a。isfirstvisitday)as首日访问人数fromtaskvisitdetailaleftjointaskreceivebona。taskidb。taskidanda。useridb。useridgroupbya。taskid,starttime,endtime,a。dtorderbya。taskiddesc,a。dt 有人问欧阳修,为什么你的文章写那么好。 欧阳修说:无他,唯手熟尔。 能把sql编写得如此行云流水,不仅对sql要熟练,逻辑思维也很重要。