首页 > 解决方案 > 在滚动两周内查找唯一计数

问题描述

我有一份学生名单以及他们在某些日子喝的饮料

╔════════════╤═════════╤═══════╤═══════╤═══════════════╗
║ Day        │ Student │ Class │ Group │ Drinks        ║
╠════════════╪═════════╪═══════╪═══════╪═══════════════╣
║ 2019-04-08 │ A       │ 3A1   │ 1     │ Coke          ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-09 │ A       │ 3A1   │ 1     │ Lemon Juice   ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-16 │ A       │ 3A1   │ 1     │ Green Tea     ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-20 │ A       │ 3A1   │ 1     │ Green Tea     ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-01 │ B       │ 3B1   │ 3     │ Pepsi         ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-02 │ B       │ 3B1   │ 3     │ Apple Juice   ║
╟────────────┼─────────┼───────┼───────┼───────────────╢
║ 2019-04-03 │ B       │ 3B1   │ 3     │ Mineral Water ║
╚════════════╧═════════╧═══════╧═══════╧═══════════════╝

我想知道每个学生在连续 14 天(每周一到下周日)有多少独特的饮料。最终输出应该是这样的

╔═════════════╤═════════╤═══════╤═══════╤════════════════════╗
║ Week Ending │ Student │ Class │ Group │ Unique Drink Count ║
╠═════════════╪═════════╪═══════╪═══════╪════════════════════╣
║ 2019-04-14  │ A       │ 3A1   │ 1     │ 2                  ║
╟─────────────┼─────────┼───────┼───────┼────────────────────╢
║ 2019-04-21  │ A       │ 3A1   │ 1     │ 3                  ║
╟─────────────┼─────────┼───────┼───────┼────────────────────╢
║ 2019-04-14  │ B       │ 3B1   │ 3     │ 3                  ║
╚═════════════╧═════════╧═══════╧═══════╧════════════════════╝

解释:

我使用的是 Oracle 数据库 11g,所以恐怕没有横向连接或外部应用。

标签: sqlplsqloracle11g

解决方案


IW您可以使用格式提取一年的周数。然后,除以 2:

select min(day), student, class, group, count(distinct drink)
from (select s.*,
             to_number(to_char(day, 'IW')) - 1 as week_number
      from students s
     ) s
group floor(week_number / 2), student, class, group;

目前尚不清楚您是想在偶数周还是奇数周开始,因此- 1可能没有必要。

请注意,这group是一个非常糟糕的列名称,因为它是一个 SQL 关键字。


推荐阅读