Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL表中查找3列上的最大值,以及单个列上的最大值_Sql_Sql Server_Vb.net - Fatal编程技术网

在SQL表中查找3列上的最大值,以及单个列上的最大值

在SQL表中查找3列上的最大值,以及单个列上的最大值,sql,sql-server,vb.net,Sql,Sql Server,Vb.net,如何在MS-SQL表中找到3列上的最大值加上单个列上的最大值 我知道如何查看列来获取它们,我知道如何进行自连接来获取单个值,但是如何将两者结合起来呢 通常,当我添加一个新值时,我拥有所有其他数据,当我添加新数据时,所有值都在手边。但对于这个特殊情况,我没有这个。我有调查id值,就是这样。我需要找到该调查的下一个问题ID,然后找到调查中的最后一个位置。它们可能不是同一件事 我会的,但这样做是vb.net,并不是说它有什么区别 我需要为每个调查找到最高的问题编号和最高的章节、分章、问题编号,即第2章

如何在MS-SQL表中找到3列上的最大值加上单个列上的最大值

我知道如何查看列来获取它们,我知道如何进行自连接来获取单个值,但是如何将两者结合起来呢

通常,当我添加一个新值时,我拥有所有其他数据,当我添加新数据时,所有值都在手边。但对于这个特殊情况,我没有这个。我有调查id值,就是这样。我需要找到该调查的下一个问题ID,然后找到调查中的最后一个位置。它们可能不是同一件事

我会的,但这样做是vb.net,并不是说它有什么区别

我需要为每个调查找到最高的问题编号和最高的章节、分章、问题编号,即第2章,第1子部分,问题1大于第1章,第99子部分,问题99

给定一个如下所示的表(调查id和问题id形成唯一对)

我的结果应该是

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(或分区),非常酷。