使用SQL中的foor循环根据两列值获取最大值
我用4列创建了一个假表: 农民姓名、作物名称、年份、工作日 该表描述了过去三年每个农民的作物以及今年的季节长度: 红色的是同一种植者使用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
>>>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刚刚添加了我创建的假数据库+添加了示例