我有一个假表,我已经创建了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 loop,但是通过阅读我发现在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
(从这里开始:https://www.techonthenet.com/sql_server/loops/for_loop.php)(与此类似:https://www.sqlshack.com/sql-while-loop-with-simple-examples/)但我不知道如何使用计数器在这种情况下,我需要最大值,我还需要检查它为每个农民。
我的最终目标是:得到一张表格,上面有所有农民的名字、年份和每个农民当年“工作日”的最大值。
3条答案
按热度按时间7cjasjjr1#
我想你可以用
max()
功能和group by
表达方式如下:bkhjykvo2#
如果您使用的是支持分析函数的sql版本,那么
ROW_NUMBER
这里的方法是:另一个版本,使用连接,但不使用分析函数,将是:
请注意,一般来说,用光标迭代记录来解决这个问题并不是一个好办法。sql本质上是基于集合的,这意味着一个sql查询已经遍历了所有记录,而不需要显式的游标。
rkue9o1l3#
请使用下面的查询,