使用SQL中的foor循环根据两列值获取最大值

使用SQL中的foor循环根据两列值获取最大值,sql,oracle,for-loop,while-loop,Sql,Oracle,For Loop,While Loop,我用4列创建了一个假表: 农民姓名、作物名称、年份、工作日 该表描述了过去三年每个农民的作物以及今年的季节长度: 红色的是同一种植者 >>>farmer crop_name year working_days red potatoe 2018 110 red onion 2019 120 red onion 2020 130 red wheat

我用4列创建了一个假表: 农民姓名、作物名称、年份、工作日

该表描述了过去三年每个农民的作物以及今年的季节长度:

红色的是同一种植者

>>>farmer   crop_name   year  working_days
   red       potatoe    2018   110
   red       onion      2019   120   
   red       onion      2020   130
   red       wheat      2019   70
   blue      coffe      2018   194
   blue      coffee     2019   115

我需要为每个农民找出每年工作日的最大价值

e、 g如果2018年红色农民的工作日价值为:124145和70,我想得到如下新表:

>>>  Farmer      year      working_days
       red        2018     145
       red        2019     190
       red        2020     175
       blue       2018     72
*这个例子中的蓝色是因为我想给我所有的农民买,而不仅仅是红色的

我更多地使用python,我觉得我想使用for循环,但从阅读中我发现这在sql中是不可能的,需要使用sql。我看到有一个选项可以使用while循环,但我不知道怎么做,当我在这里有两列需要考虑种植者姓名+年份时

我已经看到了使用while循环的示例:

DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside simulated FOR LOOP on TechOnTheNet.com';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done simulated FOR LOOP on TechOnTheNet.com';
GO
从这里开始: 这里也类似: 但我不知道在这种情况下如何使用计数器,我需要最大值,我还需要为每个农民检查它


我的最终目标是:得到一个包含所有农民姓名、年份和每个农民当年工作日最大值的表。

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

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Farmer, year ORDER BY working_days DESC) rn
    FROM yourTable
)

SELECT Farmer, year, working_days
FROM cte
WHERE rn = 1;
另一个版本(使用联接,但不使用分析函数)是:

SELECT t1.Farmer, t1.year, t1.working_days
FROM yourTable t1
INNER JOIN
(
    SELECT Farmer, year, MAX(working_days) AS max_working_days
    FROM yourTable
    GROUP BY Farmer, year
) t2
    ON t1.Farmer = t2.Farmer AND t1.year = t2.year AND
       t1.working_days = t2.working_days;
请注意,一般来说,通过使用游标迭代记录来解决此问题并不是一种可行的方法。SQL本质上是基于集合的,这意味着一个SQL查询已经遍历了所有记录,而不需要显式游标。

我认为您可以通过以下方式使用max函数和group by表达式:

SELECT
    farmer,
    year,
    max(working_days)
FROM
    farmer_table
GROUP BY
    farmer,
    year 

请使用下面的查询

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

这给出了正确的行数,但它并没有真正为种植者获取最大值。我在图片中显示,它给出的最大值是70,而不是145。请标记您所在的数据库using@JimMacaulay刚刚添加了我创建的假数据库+添加了示例