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

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

我有一个假表,我已经创建了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/)但我不知道如何使用计数器在这种情况下,我需要最大值,我还需要检查它为每个农民。
我的最终目标是:得到一张表格,上面有所有农民的名字、年份和每个农民当年“工作日”的最大值。

7cjasjjr

7cjasjjr1#

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

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

bkhjykvo2#

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

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查询已经遍历了所有记录,而不需要显式的游标。

rkue9o1l

rkue9o1l3#

请使用下面的查询,

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

相关问题