db2 每年独特口味的冰淇淋数量

oaxa6hgo  于 2024-01-07  发布在  DB2
关注(0)|答案(2)|浏览(226)

下面是一张不同年份不同口味冰淇淋的table(名称:ice_cream_table):

  1. Year Flavor
  2. 2008 Mint
  3. 2008 Mint
  4. 2008 Cookie Dough
  5. 2008 Cookie Dough
  6. 2008 Pistachio
  7. 2013 Chocolate
  8. 2013 Cookie Dough
  9. 2013 Pistachio
  10. 2013 Chocolate
  11. 2013 Pistachio
  12. 2017 Chocolate
  13. 2017 Vanilla
  14. 2017 Chocolate
  15. 2017 Cookie Dough
  16. 2017 Strawberry
  17. 2019 Mango
  18. 2019 Lemon
  19. 2019 Vanilla
  20. 2019 Mango
  21. 2019 Mango
  22. 2022 Chocolate
  23. 2022 Chocolate
  24. 2022 Mint
  25. 2022 Strawberry
  26. 2022 Cherry
  27. CREATE TABLE ice_cream_table (
  28. "Year" INT,
  29. "Flavor" VARCHAR(100)
  30. );
  31. INSERT INTO ice_cream_table
  32. ("Year", "Flavor")
  33. VALUES
  34. ('2008', 'Mint'),
  35. ('2008', 'Mint'),
  36. ('2008', 'Cookie Dough'),
  37. ('2008', 'Cookie Dough'),
  38. ('2008', 'Pistachio'),
  39. ('2013', 'Chocolate'),
  40. ('2013', 'Cookie Dough'),
  41. ('2013', 'Pistachio'),
  42. ('2013', 'Chocolate'),
  43. ('2013', 'Pistachio'),
  44. ('2017', 'Chocolate'),
  45. ('2017', 'Vanilla'),
  46. ('2017', 'Chocolate'),
  47. ('2017', 'Cookie Dough'),
  48. ('2017', 'Strawberry'),
  49. ('2019', 'Mango'),
  50. ('2019', 'Lemon'),
  51. ('2019', 'Vanilla'),
  52. ('2019', 'Mango'),
  53. ('2019', 'Mango'),
  54. ('2022', 'Chocolate'),
  55. ('2022', 'Chocolate'),
  56. ('2022', 'Mint'),
  57. ('2022', 'Strawberry'),
  58. ('2022', 'Cherry');

字符串
在每一年,我想知道:有多少种口味是第一次出现的,有多少种口味是前几年出现的,有多少种不同的口味(第一次+重复)?
下面是我的代码:

  1. with yearly_flavor as (
  2. select
  3. year,
  4. flavor,
  5. row_number() over (partition by flavor order by year) as rn
  6. from
  7. ice_cream_table
  8. group by
  9. flavor, year
  10. ),
  11. new_flavor as (
  12. select
  13. year,
  14. count(flavor) as new_flavor
  15. from
  16. yearly_flavor
  17. where
  18. rn = 1
  19. group by
  20. year
  21. ),
  22. repeated_flavor as (
  23. select
  24. year,
  25. case
  26. when count(flavor) is null then 0
  27. else count(flavor)
  28. end as repeated_flavor,
  29. count(flavor) as new_flavor
  30. from
  31. yearly_flavor
  32. where
  33. rn > 1
  34. group by
  35. year
  36. ),
  37. total_flavor as (
  38. select
  39. year,
  40. count(distinct flavor) as total_flavor
  41. from
  42. ice_cream_table
  43. group by
  44. year
  45. )
  46. select
  47. n.year,
  48. n.new_flavor,
  49. r.repeated_flavor,
  50. t.total_flavor
  51. from
  52. new_flavor n
  53. left join
  54. repeated_flavor r on n.year = r.year
  55. join
  56. total_flavor t on n.year = t.year
  57. order by
  58. n.year;


我的输出:

  1. +------+-----------+----------------+--------------+
  2. | Year | new_flavor | repeated_flavor| total_flavor |
  3. +------+-----------+----------------+--------------+
  4. | 2008 | 3 | NULL | 3 |
  5. | 2013 | 1 | 2 | 3 |
  6. | 2017 | 2 | 2 | 4 |
  7. | 2019 | 2 | 1 | 3 |
  8. | 2022 | 1 | 3 | 4 |
  9. +------+-----------+----------------+--------------+


我做得对吗?我对Python更有经验,对SQL更少......代码运行,但我不确定我的逻辑是否抓住了本质。

guykilcj

guykilcj1#

您可以使用ROW_NUMBERLAG查找每个flavor的第一行,然后按year分组并向上计数。
与其他答案相比,这有一个好处,因为它只需要对基表进行一次扫描。

  1. SELECT
  2. Year,
  3. COUNT(IsFirst) AS NewFlavors,
  4. COUNT(DISTINCT Flavor) - COUNT(IsFirst) AS RepeatedFlavors,
  5. COUNT(DISTINCT Flavor) AS TotalFlavors
  6. FROM (
  7. SELECT *,
  8. CASE WHEN ROW_NUMBER() OVER (PARTITION BY Flavor ORDER BY Year) = 1 THEN 1 END AS IsFirst
  9. FROM ice_cream_table icf
  10. ) icf
  11. GROUP BY
  12. Year;

字符串
db<>fiddle

展开查看全部
sqserrrh

sqserrrh2#

您可以使用GROUP BYLEFT JOIN如下:

  1. select t.year,
  2. count(distinct t.flavor) - count(distinct tt.flavor) as new_flavor,
  3. count(distinct tt.flavor) as repeated_flavor,
  4. count(distinct t.flavor) as total_flavor
  5. from ice_cream_table t
  6. left join ice_cream_table tt on t.year > tt.year and t.flavor = tt.flavor
  7. group by t.year

字符串

相关问题