【发布时间】:2018-04-17 14:41:12
【问题描述】:
我有如下数据表
Animal Immunization_Date
Cat 1/18/2017
Cat 1/27/2017
Cat 5/7/2017
Cat 5/12/2017
Dog 1/1/2017
Dog 1/5/2017
Dog 1/7/2017
Dog 3/25/2017
Dog 4/18/2017
我正在尝试根据动物的 10 天间隔创建排名,这将导致以下结果。 (查找动物的第一个日期,然后在该日期后 10 天内的任何日子分配一组 1。然后为未分配给 1 的动物取下一个日期并将其分配给 2 和然后将 2 分配给该日期后 10 天内的任何日期等...)
Animal Immunization_Date 10_Day_Group_Rank
Cat 1/18/2017 1
Cat 1/27/2017 1
Cat 5/7/2017 2
Cat 5/12/2017 2
Dog 1/1/2017 1
Dog 1/5/2017 1
Dog 1/7/2017 1
Dog 3/25/2017 2
Dog 4/18/2017 3
我一直在尝试以下代码,但我似乎无法让 10 天小组工作。
Select
dt.Animal,
dt.Immunization_Date,
sum(dt.10_day_Group) over(partition dt.Animal order by dt.Immunization_Date rows unbounded preceding) as 10_day_Group --creates a running total that is also the group
from
(
Select
Animal,
Immunization_Date,
case when min(Immunization_Date) over (partition by Animal order by Immunization_Date) <=10 then 1 else 0 end as 10_Day_Group --Create intervals of 10 days
from Table_A
) as dt
我不确定如何将 10 天分组放在一起。
case when min(Immunization_Date) over (partition by Animal order by Immunization_Date) <=10 then 1 else 0 end as 10_Day_Group
我可以在 Excel 中执行以下操作。我知道 excel 和 SQL 是不同的,但我希望如果看到它可以在 Excel 中完成,如果有什么可以在 SQL 中完成。
Excel 数据表如下所示(表从单元格A1 开始)。 (注意Animal 需要排序,Immunization_Date 需要排序才能使 Excel 公式起作用)
Animal Immunization_Date Dummy_1 10_Day_Group
Cat 1/18/2017 1/18/2017 1
Cat 1/27/2017 1/18/2017 1
Cat 5/7/2017 5/7/2017 2
Cat 5/12/2017 5/7/2017 2
Dog 1/1/2017 1/1/2017 1
Dog 1/5/2017 1/1/2017 1
Dog 1/7/2017 1/1/2017 1
Dog 3/25/2017 3/25/2017 2
Dog 4/18/2017 4/18/2017 3
Dummy_1 的公式如下
IFERROR(IF(AND(A2=A1,B2-C1<=10),C1,B2),B2)
10_Day_Group 的公式如下
IFERROR(IF(AND(C2=C1,A2=A1),D1,IF(AND(A2=A1,C2<>C1),D1+1,1)),1)
【问题讨论】:
-
如果数据中有 Cat, 1/29/2018 会怎样?
-
感谢您指出这一点。
1/27/18应该是1/27/17我在我的操作中更新了 -
您的业务逻辑我不清楚,您的示例数据感觉不一致。例如,一只狗在 4 月 18 日接种了疫苗,在该日期前后 10 天没有接种其他疫苗,但 10 天排名为 3?
-
由于在 2017 年 4 月 18 日之前 10 天没有日期,所以它将开始一个新的 10 天间隔,因此将是 3。所以狗的 10 天间隔将从 1/1 开始/17 之后 10 天内的任何日子都将被视为
1。在该 10 天间隔之后的数据集中可用的下一个日期将被标记为2。在狗的例子中,那个日期是 3/25/17。 -
这将变得混乱、复杂、昂贵并且可能很慢。你需要那个,还是一个近似值就足够了? (另外,请注意,虽然
11-1=10,{1,2,3,4,5,6,7,8,9,10}组中有 10 天。因此,第 11 天自然会与第 1 天在不同的组中......)