请教一下SQL 大神

c
cottonfield
楼主 (北美华人网)
请教一下SQL 大神 - 有个报告需要昨天的销量。要每天运算昨天的数据 (不包含周末,只要礼拜一到五)。譬如说如果今天是礼拜四,就需要昨天礼拜三的数据。如果今天是礼拜一,需要上个礼拜五的。这样的时间段 Where cause 该怎么写: WHERE DATE BETWEEN '2022-01-01' AND ??? (DATEADD?)
t
taury
菜鸟试着提供一个思路:where date=(select maximum(date) from table where date < current date ). 好像不对哈,这个要求周六周日没数据,容易出错
g
gokgs
多 google, you need weekday function for sure.
s
shantianxia
回复 1楼cottonfield的帖子
you can try this method to calculate working days between 2 dates. SELECT (DATEDIFF(dd, LossDate, ClaimDate) + 1) -(DATEDIFF(wk, LossDate, ClaimDate) * 2) -(CASE WHEN DATENAME(dw, LossDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, ClaimDate) = 'Saturday' THEN 1 ELSE 0 END) AS WorkDay_Numbers.
p
pp.piggy
有weekday的function可以用
s
sqlpad
Lag/lead function.
c
cindyela
select lag(sale, 1) over (order by order_date) as lag_sale from order_table where weekday(order_date) not in (5, 6)

j
jianliu67
不知道楼主需不需要考虑节假日。如果需要的话会更复杂一些。
g
gokgs
SQL 怎么还这么普及? 很简单的问题经常要写一个巨复杂的 query ,简直是反人类。
i
itisgood
请教一下SQL 大神 - 有个报告需要昨天的销量。要每天运算昨天的数据 (不包含周末,只要礼拜一到五)。譬如说如果今天是礼拜四,就需要昨天礼拜三的数据。如果今天是礼拜一,需要上个礼拜五的。这样的时间段 Where cause 该怎么写: WHERE DATE BETWEEN '2022-01-01' AND ??? (DATEADD?)
cottonfield 发表于 2022-10-13 22:29

因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断:
1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五
2.时间是用timestamp来存储的(是个整数),不要用 date
3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做
select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2
ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
圆棱角
非大牛。 如果公司周末没有销量的话 - 就where 后面两个条件用and连接,一个大于起始日,一个不等于今天。如果公司周末有销量的话 - 就用case when和 weekday 设个条件,加个今天是周一的情况。
f
fallfall
SQL 怎么还这么普及? 很简单的问题经常要写一个巨复杂的 query ,简直是反人类。

gokgs 发表于 2022-10-14 02:02

不是抬杠,请问一下不用写复杂query的语言是什么,我想学一下。我也经常写这些语句,总是有考虑不到的地方,然后老是要修修补补,很累。
f
fallfall
因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断:
1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五
2.时间是用timestamp来存储的(是个整数),不要用 date
3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做
select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2
ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
itisgood 发表于 2022-10-14 07:11

你这说了等于没说啊, 人家问的SQL怎么做,你说需要Java/python, 好嘛你说了java/python你又不说具体怎么用这两个解决这个问题,就说了一个‘’做好星期的判断‘’,这谁能懂? 最后丢了一个巨简单的where,那是人都会啊,用你说? 你要么就继续说一下java/python怎么写,不然没有诚意
c
cottonfield
一天没看贴好多高手回啊! 谢谢大家。周末我一个个试过去看看。
c
cottonfield
因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断:
1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五
2.时间是用timestamp来存储的(是个整数),不要用 date
3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做
select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2
ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
itisgood 发表于 2022-10-14 07:11

菜鸟我连SQL都写不清楚啊,哪会用JAVA/Python啊。
c
cottonfield
非大牛。 如果公司周末没有销量的话 - 就where 后面两个条件用and连接,一个大于起始日,一个不等于今天。如果公司周末有销量的话 - 就用case when和 weekday 设个条件,加个今天是周一的情况。
圆棱角 发表于 2022-10-14 09:12

周末没人工作,所以1-5就可以了。
c
cottonfield
不知道楼主需不需要考虑节假日。如果需要的话会更复杂一些。
jianliu67 发表于 2022-10-14 01:57

这个如果有人礼拜跑天去看报告的话,会给出空白数据吗?因为这个报告是连接Power BI autorefresh的。
c
cottonfield
select lag(sale, 1) over (order by order_date) as lag_sale from order_table where weekday(order_date) not in (5, 6)


cindyela 发表于 2022-10-13 23:28

谢谢mm, 可以解析一下5, 6是啥意思吗?
c
cottonfield
回复 1楼cottonfield的帖子
you can try this method to calculate working days between 2 dates. SELECT (DATEDIFF(dd, LossDate, ClaimDate) + 1) -(DATEDIFF(wk, LossDate, ClaimDate) * 2) -(CASE WHEN DATENAME(dw, LossDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, ClaimDate) = 'Saturday' THEN 1 ELSE 0 END) AS WorkDay_Numbers.

shantianxia 发表于 2022-10-13 22:44

好高级,我试试。谢谢mm!
c
cottonfield
SQL 怎么还这么普及? 很简单的问题经常要写一个巨复杂的 query ,简直是反人类。

gokgs 发表于 2022-10-14 02:02

SQL还好。。。DAX才反人类。一个逗号隔开千位数都要写一堆。不过也许因为我是菜鸟。。。
E
Ethanmom
谢谢mm, 可以解析一下5, 6是啥意思吗?
cottonfield 发表于 2022-10-14 20:46


Week_day returns day of the week. 如果是周一 这个return value is 0, 以此类推, 周六周日return value will be 5,6. 所以用 week_day(day) not in (5,6) . 不知道解释的清楚吗。 week_day usage: Definition and Usage The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday.
c
cottonfield

Week_day returns day of the week. 如果是周一 这个return value is 0, 以此类推, 周六周日return value will be 5,6. 所以用 week_day(day) not in (5,6) . 不知道解释的清楚吗。 week_day usage: Definition and Usage The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday.
Ethanmom 发表于 2022-10-14 20:55

明白了!谢谢mm!
s
svsun
这个可以: select sum(sales), sdate from sales_table where sdate = case when datepart(weekday,CAST( GETDATE() AS Date )) =2 then dateadd(day,-3, CAST( GETDATE() AS Date )) else dateadd(day,-1, CAST( GETDATE() AS Date )) end group by sdate
c
cottonfield
这个可以: select sum(sales), sdate from sales_table where sdate = case when datepart(weekday,CAST( GETDATE() AS Date )) =2 then dateadd(day,-3, CAST( GETDATE() AS Date )) else dateadd(day,-1, CAST( GETDATE() AS Date )) end group by sdate
svsun 发表于 2022-10-14 22:07

谢谢!我去试试看!
d
dana466
留着参考
j
jianliu67
因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断:
1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五
2.时间是用timestamp来存储的(是个整数),不要用 date
3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做
select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2
ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
itisgood 发表于 2022-10-14 07:11

你的说法太武断。有些时候还真得具体情况具体分析。
SQL 是 set operation,其它程序语言是 record by record operation。从效率上讲,如果一个问题能用SQL解决,效率是最高的。
j
jianliu67
这个如果有人礼拜跑天去看报告的话,会给出空白数据吗?因为这个报告是连接Power BI autorefresh的。
cottonfield 发表于 2022-10-14 20:44

这个就要看你的 business requirement 了。比如说,一个人周末去看报告,你可以给他周五的结果啊。
c
cottonfield
这个就要看你的 business requirement 了。比如说,一个人周末去看报告,你可以给他周五的结果啊。
jianliu67 发表于 2022-10-15 00:48

对,我就是想要给周五weekday的结果,不是前一天的。