如何解决SQL:如何选择仅每三周发生一次的订单?
我有一个订单表,每个星期四都下订单。因此,每个订单都有1到52之间的fiscal_week_number
与之关联。
每个订单都分为几批,其中一个订单可以包含多个交易,每个交易在单独的一周内计费。例如,order_number
0001在fiscal_week_numbers
4、5、6、7上计费,并且有transaction_numbers
100000001、100000002、100000003、100000004。假定transaction_numbers是非顺序且随机的。>
每周有一些订单帐单,每两周有一些帐单,每3周有一些帐单,等等。我如何查询表以仅显示每X周开帐单的订单?
例如,我想找出每6周有多少订单(即,不同的order_ids
)账单,但是我不知道SQL。
例如,假设我只想从以下数据集中获取每三周一次的订单。我希望只收到订单00003
。是否所有订单数据都存在或仅存在ID都没有关系。
|00003 |319229 |20 |
|00003 |319230 |23 |
|00003 |238678 |26 |
|00003 |319231 |29 |
|00003 |190659 |32 |
+--------+-----------------+--------------+
|order_id|transactionnumber|fiscal_week_no|
+--------+-----------------+--------------+
|00001 |278100 |1 |
|00001 |278101 |2 |
|00001 |278102 |3 |
|00001 |278103 |4 |
|00001 |278104 |5 |
|00002 |319224 |10 |
|00002 |319225 |12 |
|00002 |319226 |14 |
|00002 |319227 |16 |
|00002 |319228 |18 |
|00003 |319229 |20 |
|00003 |319230 |23 |
|00003 |238678 |26 |
|00003 |319231 |29 |
|00003 |190659 |32 |
|00004 |319232 |26 |
|00004 |190660 |30 |
|00004 |190661 |34 |
|00004 |190662 |38 |
|00004 |319233 |42 |
|00005 |190663 |40 |
|00005 |319234 |45 |
|00005 |190664 |50 |
|00005 |190665 |3 |
|00005 |190666 |8 |
|00006 |319235 |10 |
|00006 |190667 |16 |
|00006 |190668 |22 |
|00006 |319236 |28 |
|00006 |190669 |34 |
|00007 |319237 |20 |
|00007 |190670 |28 |
|00007 |190671 |36 |
|00007 |319238 |44 |
|00007 |190672 |52 |
|00007 |190673 |8 |
+--------+-----------------+--------------+
解决方法
根据您的描述,如果fiscal_week_no
列始终相同(以3为模),则每三周订购一次订单。因此,一种方法是:
select order_id
from t
group by order_id
having min(fiscal_week_no % 3) = max(fiscal_week_no % 3);
请注意,这不能保证每三周就向他们收费(我们可以为此添加一张额外的支票。但是这些将是在同一结算周期内的订单。
,我认为这段代码也可能有用。这将返回在@bill_freq变量中设置的任何交易数量的order_id。我用了编造的数据。
declare @bill_freq int=2;
;with rn_cte(order_id,transactionnumber,fiscal_week_no,wk_rn) as (
select *,row_number() over (partition by order_id order by order_id,fiscal_week_no) wk_rn
from (values ('00001',278100,1),('00001',278101,2),('00002',278102,3),278103,4),('00003',278104,5),('00004',278105,7),278106,9)) v(order_id,fiscal_week_no))
select order_id
from rn_cte
group by order_id
having max(wk_rn)=@bill_freq;
结果
order_id
00001
00002
00004
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。