在sql中使用foor循环根据两列值获取最大值

wlwcrazw  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(373)

我有一个假表,我已经创建了4列:农民名称,作物名称,年,工作日
该表描述了过去三年每个农民的作物和今年的季节长度:

(红色的是同一个种植者)

  1. >>>farmer crop_name year working_days
  2. red potatoe 2018 110
  3. red onion 2019 120
  4. red onion 2020 130
  5. red wheat 2019 70
  6. blue coffe 2018 194
  7. blue coffee 2019 115

我需要为每个农民找出每年工作日的最大价值。
e、 g如果对于2018年的红农,我们的工作日值为:124145和70,我想得到如下的新表:

  1. >>> Farmer year working_days
  2. red 2018 145
  3. red 2019 190
  4. red 2020 175
  5. blue 2018 72
  • 这个例子中的蓝色是因为我想为我所有的农民买,而不仅仅是红色的。

我更多地使用python,我觉得我想使用for loop,但是通过阅读我发现在sql中这是不可能的,需要用sql来实现。我看到有一个选项可以使用while循环,但我不知道如何做到这一点当我在这里有两列需要考虑(种植者姓名+年份)。
我已经看到了使用while循环的例子:

  1. DECLARE @cnt INT = 0;
  2. WHILE @cnt < 10
  3. BEGIN
  4. PRINT 'Inside simulated FOR LOOP on TechOnTheNet.com';
  5. SET @cnt = @cnt + 1;
  6. END;
  7. PRINT 'Done simulated FOR LOOP on TechOnTheNet.com';
  8. GO

(从这里开始:https://www.techonthenet.com/sql_server/loops/for_loop.php)(与此类似:https://www.sqlshack.com/sql-while-loop-with-simple-examples/)但我不知道如何使用计数器在这种情况下,我需要最大值,我还需要检查它为每个农民。
我的最终目标是:得到一张表格,上面有所有农民的名字、年份和每个农民当年“工作日”的最大值。

7cjasjjr

7cjasjjr1#

我想你可以用 max() 功能和 group by 表达方式如下:

  1. SELECT
  2. farmer,
  3. year,
  4. max(working_days)
  5. FROM
  6. farmer_table
  7. GROUP BY
  8. farmer,
  9. year
bkhjykvo

bkhjykvo2#

如果您使用的是支持分析函数的sql版本,那么 ROW_NUMBER 这里的方法是:

  1. WITH cte AS (
  2. SELECT *, ROW_NUMBER() OVER (PARTITION BY Farmer, year ORDER BY working_days DESC) rn
  3. FROM yourTable
  4. )
  5. SELECT Farmer, year, working_days
  6. FROM cte
  7. WHERE rn = 1;

另一个版本,使用连接,但不使用分析函数,将是:

  1. SELECT t1.Farmer, t1.year, t1.working_days
  2. FROM yourTable t1
  3. INNER JOIN
  4. (
  5. SELECT Farmer, year, MAX(working_days) AS max_working_days
  6. FROM yourTable
  7. GROUP BY Farmer, year
  8. ) t2
  9. ON t1.Farmer = t2.Farmer AND t1.year = t2.year AND
  10. t1.working_days = t2.working_days;

请注意,一般来说,用光标迭代记录来解决这个问题并不是一个好办法。sql本质上是基于集合的,这意味着一个sql查询已经遍历了所有记录,而不需要显式的游标。

展开查看全部
rkue9o1l

rkue9o1l3#

请使用下面的查询,

  1. select farmer, year, max(working_days) from table_name
  2. group by farmer, year order by year;

相关问题