在SQL表中查找3列上的最大值,以及单个列上的最大值
如何在MS-SQL表中找到3列上的最大值加上单个列上的最大值 我知道如何查看列来获取它们,我知道如何进行自连接来获取单个值,但是如何将两者结合起来呢 通常,当我添加一个新值时,我拥有所有其他数据,当我添加新数据时,所有值都在手边。但对于这个特殊情况,我没有这个。我有调查id值,就是这样。我需要找到该调查的下一个问题ID,然后找到调查中的最后一个位置。它们可能不是同一件事 我会的,但这样做是vb.net,并不是说它有什么区别 我需要为每个调查找到最高的问题编号和最高的章节、分章、问题编号,即第2章,第1子部分,问题1大于第1章,第99子部分,问题99 给定一个如下所示的表(调查id和问题id形成唯一对) 我的结果应该是在SQL表中查找3列上的最大值,以及单个列上的最大值,sql,sql-server,vb.net,Sql,Sql Server,Vb.net,如何在MS-SQL表中找到3列上的最大值加上单个列上的最大值 我知道如何查看列来获取它们,我知道如何进行自连接来获取单个值,但是如何将两者结合起来呢 通常,当我添加一个新值时,我拥有所有其他数据,当我添加新数据时,所有值都在手边。但对于这个特殊情况,我没有这个。我有调查id值,就是这样。我需要找到该调查的下一个问题ID,然后找到调查中的最后一个位置。它们可能不是同一件事 我会的,但这样做是vb.net,并不是说它有什么区别 我需要为每个调查找到最高的问题编号和最高的章节、分章、问题编号,即第2章
survey_id | suveyMAXquestion_id | Maxchapter | Maxsubchapter | Maxquestion_number
=================================================================================
505 | 2 | 1 | 1 | 3
5858 | 47 | 2 | 1 | 2
6060 | 47 | 2 | 1 | 2
我最后要做的是将一个新值放入表中,该表包含调查id、问题id+1和章节、分章、问题编号+1
表中插入的数据(更新表中未显示的其他列后)将为:
这有点复杂,但确实可行。既然你提到你有调查id,我就把它作为一个参数。在你试图做的事情中有两种不同的想法。首先,您需要调查id的最大问题id。另一个想法是,您需要列出的最高章节和子章节的最大问题编号。这必须按顺序找到。首先,我们需要最伟大的章节,然后是最伟大的分章,最后是最大问题数
Select q.survey_id, (Select max(question_id) from tblQuestion where survey_id=q.survey_id), q.chapter, q.subchapter, max(q.question_number)
From tblQuestion q
Where q.survey_id = @survey_id
and q.chapter = (Select max(chapter)
From tblQuestion qq
Where qq.survey_id=q.survey_id)
and q.subchapter = (Select max(subchapter)
From tblQuestion qq
Where qq.survey_id=q.survey_id
and qq.chapter = q.chapter)
Group by q.survey_id, q.chapter, q.subchapter
这有点复杂,但确实可行。既然你提到你有调查id,我就把它作为一个参数。在你试图做的事情中有两种不同的想法。首先,您需要调查id的最大问题id。另一个想法是,您需要列出的最高章节和子章节的最大问题编号。这必须按顺序找到。首先,我们需要最伟大的章节,然后是最伟大的分章,最后是最大问题数
Select q.survey_id, (Select max(question_id) from tblQuestion where survey_id=q.survey_id), q.chapter, q.subchapter, max(q.question_number)
From tblQuestion q
Where q.survey_id = @survey_id
and q.chapter = (Select max(chapter)
From tblQuestion qq
Where qq.survey_id=q.survey_id)
and q.subchapter = (Select max(subchapter)
From tblQuestion qq
Where qq.survey_id=q.survey_id
and qq.chapter = q.chapter)
Group by q.survey_id, q.chapter, q.subchapter
因为您使用的是SQL Server,所以使用CTE将允许您做您想做的事情
with cte (survey_id, chapter, subchapter, question_number, rank)
as
(
select survey_id, chapter, subchapter, question_number,
rank() over (partition by survey_id order by chapter desc, subchapter desc, question_number desc)
from tblquestion
)
select q.survey_id, max(q.question_id) as question_id, c.chapter, c.subchapter, c.question_number
from cte c
inner join tblQuestion q on q.Survey_id = c.survey_id
where c.rank = 1
group by q.survey_id, c.chapter, c.subchapter, c.question_number
因为您使用的是SQL Server,所以使用CTE将允许您执行所需的操作
with cte (survey_id, chapter, subchapter, question_number, rank)
as
(
select survey_id, chapter, subchapter, question_number,
rank() over (partition by survey_id order by chapter desc, subchapter desc, question_number desc)
from tblquestion
)
select q.survey_id, max(q.question_id) as question_id, c.chapter, c.subchapter, c.question_number
from cte c
inner join tblQuestion q on q.Survey_id = c.survey_id
where c.rank = 1
group by q.survey_id, c.chapter, c.subchapter, c.question_number
您可以使用窗口聚合函数获得这两个函数,而无需额外的联接:
SELECT survey_id, max_question_id, chapter, subchapter, question_number
FROM
(
SELECT survey_id, chapter, subchapter, question_number,
MAX(question_id)
OVER (PARTITION BY survey_id) AS max_question_id,
ROW_NUMBER()
OVER (PARTITION BY survey_id
ORDER BY chapter DESC, subchapter DESC, question_number DESC) AS rnk
FROM tblquestion
) AS dt
WHERE rnk = 1
您可以使用窗口聚合函数获得这两个函数,而无需额外的联接:
SELECT survey_id, max_question_id, chapter, subchapter, question_number
FROM
(
SELECT survey_id, chapter, subchapter, question_number,
MAX(question_id)
OVER (PARTITION BY survey_id) AS max_question_id,
ROW_NUMBER()
OVER (PARTITION BY survey_id
ORDER BY chapter DESC, subchapter DESC, question_number DESC) AS rnk
FROM tblquestion
) AS dt
WHERE rnk = 1
我要提到的另一件事是,您可能希望替换子选择中的一些where子句,以连接参数,而不是q.survey_id。它可以通过更改执行计划来提高性能,具体取决于您的索引中是否包含章节和子章节。我的需求不需要太多性能,也就是说,我可以降低数据库/服务器的运行速度,而不会给其他用户带来问题。我要提到的另一件事是,您可能希望替换子选择中的一些where子句,以连接参数,而不是q.survey_id。它可以通过更改执行计划来提高性能,取决于您的索引中是否包含章节和子章节。我的需求不需要太多性能,也就是说,我可以降低数据库/服务器的速度,而不会给其他用户带来问题。我不知道如何使用此功能。以前从未见过CTE。我不明白我该如何使用它。以前从未见过CTE。我以前从未见过使用过OVER(或分区),非常酷。我以前从未见过OVER(或分区),非常酷。