天道酬勤,学无止境

如何在SQL Server中使用RANK()(How to use RANK() in SQL Server)

问题

我在SQL Server中使用RANK()有问题。

这是我的代码:

SELECT contendernum,
       totals, 
       RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank
FROM (
   SELECT ContenderNum,
          SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a

该查询的结果是:

contendernum    totals    xRank
          1       196        1
          2       181        1
          3       192        1
          4       181        1
          5       179        1

我想要的结果是:

contendernum    totals    xRank
          1       196        1
          2       181        3
          3       192        2
          4       181        3
          5       179        4

我想根据totals对结果进行排名。 如果有类似181值,则两个数字将具有相同的xRank

回答1

改变:

RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank

到:

RANK() OVER (ORDER BY totals DESC) AS xRank

看一下这个例子:

SQL小提琴演示

您可能还想看看RANK(Transact-SQL)和DENSE_RANK(Transact-SQL)之间的区别:

排名(Transact-SQL)

如果有两个或更多行并列,则每个并列的行都将获得相同的列。 例如,如果两个最高销售人员具有相同的SalesYTD值,则他们都将排在第一位。 SalesYTD排名第二的销售人员排名第三,因为有两行排名较高。 因此,RANK函数并不总是返回连续的整数。

DENSE_RANK (Transact-SQL)

返回结果集分区内的行的排名,排名中没有任何空白。 行的等级等于该行之前的不同等级的数量加上一个。

回答2

要回答您的问题标题“如何在SQL Server中使用Rank()”,它的工作方式是:

我将以这组数据为例:

create table #tmp
(
  column1 varchar(3),
  column2 varchar(5),
  column3 datetime,
  column4 int
)

insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10)
insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15)
insert into #tmp values ('AAA', 'SKB', '2013-01-31 00:00:00', 20)
insert into #tmp values ('AAA', 'SKB', '2013-01-15 00:00:00', 5)
insert into #tmp values ('AAA', 'SKC', '2013-02-01 00:00:00', 25)

您有一个基本上指定分组的分区。

在此示例中,如果按column2进行分区,那么rank函数将为column2值的组创建等级。 column2 ='SKA'的行与column2 ='SKB'的行会有不同的排名,依此类推。

排名是这样确定的:每个记录的排名是一个加在其分区之前的排名数。 仅当您选择的一个字段(分区字段除外)与之前的字段不同时,排名才会增加。 如果所有选定字段都相同,则等级将平局,并且两个值都将被分配为一。

知道这一点,如果我们只想从第二列的每个组中选择一个值,则可以使用以下查询:

with cte as 
(
  select *, 
  rank() over (partition by column2 
             order by column3) rnk
  from t

) select * from cte where rnk = 1 order by column3;

结果:

COLUMN1 | COLUMN2   | COLUMN3                           |COLUMN4 | RNK
------------------------------------------------------------------------------
AAA     | SKB   | January, 15 2013 00:00:00+0000    |5   | 1
AAA     | SKA   | January, 31 2013 00:00:00+0000    |15  | 1
AAA     | SKC   | February, 01 2013 00:00:00+0000   |25  | 1

SQL演示

回答3

您必须使用DENSE_RANK而不是RANK。 唯一的区别是它不会留下空白。 您也不应该按contender_num进行分区,否则将每个竞争者排在一个单独的组中,因此每个竞争者在其单独的组中排名第一!

SELECT contendernum,totals, DENSE_RANK() OVER (ORDER BY totals desc) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a
order by contendernum

使用StackOverflow的提示,请发布DDL和示例数据,以便人们可以用更少的时间帮助您!

create table Cat1GroupImpersonation (
contendernum int,
criteria1 int,
criteria2 int,
criteria3 int,
criteria4 int);

insert Cat1GroupImpersonation select
1,196,0,0,0 union all select
2,181,0,0,0 union all select
3,192,0,0,0 union all select
4,181,0,0,0 union all select
5,179,0,0,0;
回答4

DENSE_RANK()是无间隙的等级,即“密集”。

select Name,EmailId,salary,DENSE_RANK() over(order by salary asc) from [dbo].[Employees]

RANK()-包含等级之间的差距。

select Name,EmailId,salary,RANK() over(order by salary asc) from [dbo].[Employees]
回答5

您已经按ContenderNum进行了分组,无需再次对其进行分区。 使用Dense_rank()并按合计desc排序。 简而言之,

SELECT contendernum,totals, **DENSE_RANK()** 
OVER (ORDER BY totals **DESC**) 
AS xRank 
FROM
(
   SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM dbo.Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a
回答6
SELECT contendernum,totals, RANK() OVER (ORDER BY totals ASC) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a
回答7

RANK()很好,但是它为相同或相似的值分配了相同的等级。 而且,如果您需要唯一的排名,那么ROW_NUMBER()就可以解决此问题

ROW_NUMBER() OVER (ORDER BY totals DESC) AS xRank
回答8

选择T.Tamil,T.English,T.Maths,T.Total,Dense_Rank()Over(按T.Total Desc排序)作为Std_Rank From(选择Tamil,English,Maths,(Tamil + English + Maths)作为总计来自学生)作为T

在此处输入图片说明

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SQL Server中的行偏移(Row Offset in SQL Server)
    问题 SQL Server中有什么方法可以使结果从给定的偏移量开始? 例如,在另一种类型的SQL数据库中,可以执行以下操作: SELECT * FROM MyTable OFFSET 50 LIMIT 25 得到结果51-75。 SQL Server中似乎不存在此构造。 如何在不加载我不关心的所有行的情况下完成此任务? 谢谢! 回答1 我会避免使用SELECT * 。 指定您实际上想要的列,即使它们可能全部都是。 SQL Server 2005以上版本 SELECT col1, col2 FROM ( SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM MyTable ) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow SQL Server 2000 通过SQL Server 2000中的大型结果集有效地分页 通过大型结果集进行分页的更有效方法 回答2 如果TOP (25) ... WHERE Key > @last_key ORDER BY Key顺序处理所有页面,则只需记住在上一页中看到的最后一个键值并使用TOP (25) ... WHERE Key > @last_key ORDER BY
  • 如何获得累计金额(How to get cumulative sum)
    问题 declare @t table ( id int, SomeNumt int ) insert into @t select 1,10 union select 2,12 union select 3,3 union select 4,15 union select 5,23 select * from @t 上面的选择向我返回了以下内容。 id SomeNumt 1 10 2 12 3 3 4 15 5 23 我如何获得以下信息: id srome CumSrome 1 10 10 2 12 22 3 3 25 4 15 40 5 23 63 回答1 select t1.id, t1.SomeNumt, SUM(t2.SomeNumt) as sum from @t t1 inner join @t t2 on t1.id >= t2.id group by t1.id, t1.SomeNumt order by t1.id SQL Fiddle示例 输出 | ID | SOMENUMT | SUM | ----------------------- | 1 | 10 | 10 | | 2 | 12 | 22 | | 3 | 3 | 25 | | 4 | 15 | 40 | | 5 | 23 | 63 | 编辑:这是一个通用的解决方案,将可在大多数数据库平台上使用。
  • How to use RANK() in SQL Server
    I have a problem using RANK() in SQL Server. Here’s my code: SELECT contendernum, totals, RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank FROM ( SELECT ContenderNum, SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals FROM Cat1GroupImpersonation GROUP BY ContenderNum ) AS a The results for that query are: contendernum totals xRank 1 196 1 2 181 1 3 192 1 4 181 1 5 179 1 What my desired result is: contendernum totals xRank 1 196 1 2 181 3 3 192 2 4 181 3 5 179 4 I want to rank the result based on totals. If there are same value like 181, then two numbers will have the
  • SQL Server:快速查询,但过程缓慢(SQL Server: Query fast, but slow from procedure)
    问题 查询运行速度很快: DECLARE @SessionGUID uniqueidentifier SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908' SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 子树成本:0.502 但是将相同的SQL放入存储过程运行速度很慢,并且执行计划完全不同 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank EXECUTE ViewOpener @SessionGUID 子树成本:19.2 我跑了 sp_recompile ViewOpener 而且它仍然运行相同(严重),并且我还将存储过程更改为 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS SELECT *, 'recompile please'
  • 可以使用DISTINCT进行分区函数COUNT()的覆盖(Partition Function COUNT() OVER possible using DISTINCT)
    问题 我正在尝试编写以下内容,以便获得不同的NumUser的总运行量,如下所示: NumUsers = COUNT(DISTINCT [UserAccountKey]) OVER (PARTITION BY [Mth]) Management Studio对此不太满意。 当我删除DISTINCT关键字时,错误消失了,但是不会有明显的区别。 在分区功能中似乎无法实现DISTINCT 。 我如何去寻找不同的计数? 我是否使用更传统的方法,例如相关子查询? 进一步研究一下,也许这些OVER函数与Oracle的工作方式不同,因为它们无法在SQL-Server用于计算运行总计。 我在SQLfiddle上添加了一个实时示例,在该示例中,我尝试使用分区函数来计算运行总计。 回答1 使用density_rank()有一个非常简单的解决方案 dense_rank() over (partition by [Mth] order by [UserAccountKey]) + dense_rank() over (partition by [Mth] order by [UserAccountKey] desc) - 1 这将为您提供确切的要求:每个月内不同的UserAccountKeys的数量。 回答2 死灵法师: 通过DENSE_RANK用MAX模拟PARTITION BY上的COUNT
  • SQL Server IN与EXISTS的性能(SQL Server IN vs. EXISTS Performance)
    问题 我很好奇以下哪个会更有效? 我一直对使用IN持谨慎态度,因为我相信SQL Server会将结果集转换为大的IF语句。 对于较大的结果集,这可能会导致性能下降。 对于较小的结果集,我不确定哪一个都更好。 对于较大的结果集, EXISTS会更有效? WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2) 与 WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2]) 回答1 EXISTS将会更快,因为一旦引擎找到了命中点,它就会退出,因为条件已经证明是正确的。 使用IN ,它将在进一步处理之前从子查询中收集所有结果。 回答2 可接受的答案是短视的,问题有点松散: 1)都没有明确提及左侧,右侧或两侧是否存在覆盖索引。 2)都不考虑输入左侧集和输入右侧集的大小。 (该问题仅提及总体上较大的结果集)。 我相信,当由于(1)和(2)造成巨大的成本差异时,优化器足够聪明,可以在“输入”与“存在”之间进行转换,否则它可能仅用作提示(例如,存在鼓励使用右侧的可检索索引)。 两种形式都可以转换为内部联接形式,颠倒联接顺序,并根据估计的行数(左右)和左侧,右侧或两侧的索引存在情况以循环,哈希或合并的方式运行。 回答3 我已经在SQL
  • 为每个类别选择前10条记录(Select top 10 records for each category)
    问题 我想在一个查询中返回每个部分的前10条记录。 任何人都可以帮忙吗? 节是表中的列之一。 数据库是SQL Server2005。我想按输入的日期返回前十名。 部分是业务,本地和功能。 对于一个特定的日期,我只想要前(10)个业务行(最近输入),前(10)个本地行和前(10)个功能。 回答1 如果您使用的是SQL 2005,则可以执行以下操作... SELECT rs.Field1,rs.Field2 FROM ( SELECT Field1,Field2, Rank() over (Partition BY Section ORDER BY RankCriteria DESC ) AS Rank FROM table ) rs WHERE Rank <= 10 如果您的RankCriteria有联系,那么您可能会返回10行以上,而Matt的解决方案可能更适合您。 回答2 在T-SQL中,我将执行以下操作: WITH TOPTEN AS ( SELECT *, ROW_NUMBER() over ( PARTITION BY [group_by_field] order by [prioritise_field] ) AS RowNo FROM [table_name] ) SELECT * FROM TOPTEN WHERE RowNo <= 10 回答3 SELECT r.*
  • SQL Server: Query fast, but slow from procedure
    A query runs fast: DECLARE @SessionGUID uniqueidentifier SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908' SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank subtree cost: 0.502 But putting the same SQL in a stored procedure runs slow, and with a totally different execution plan CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank EXECUTE ViewOpener @SessionGUID Subtree cost: 19.2 I've run sp_recompile ViewOpener And it still runs the same
  • oracle运维个人常用检查语句整理
    1、查找排序最多的SQL SQL> SELECT HASH_VALUE, SQL_TEXT, SORTS, EXECUTIONS FROM V$SQLAREA ORDER BY SORTS DESC; 2、查找磁盘读写最多的SQL SQL> SELECT * FROM (SELECT sql_text,disk_reads "total disk" , executions "total exec",disk_reads/executions "disk/exec" FROM v$sql WHERE executions>0 and is_obsolete='N' ORDER BY 4 desc) WHERE ROWNUM<11 ; 3、查找工作量最大的SQL(实际上也是按磁盘读写来排序的) SQL> select substr(to_char(s.pct, '99.00'), 2) || '%' load,s.executions executes,p.sql_text from(select address,disk_reads,executions,pct,rank() over (order by disk_reads desc) ranking from (select address,disk_reads,executions,100 * ratio_to_report
  • 获得每个组的最佳结果(在Oracle中)(Get top results for each group (in Oracle))
    问题 我如何能够在oracle查询中为几个组获得N个结果。 例如,给定下表: |--------+------------+------------| | emp_id | name | occupation | |--------+------------+------------| | 1 | John Smith | Accountant | | 2 | Jane Doe | Engineer | | 3 | Jack Black | Funnyman | |--------+------------+------------| 有更多行和更多职业。 我想从每个职业中聘请三名员工(可以说)。 有没有不用子查询就可以做到这一点的方法? 回答1 这将产生所需的内容,并且不使用供应商特定的SQL功能,例如TOP N或RANK()。 SELECT MAX(e.name) AS name, MAX(e.occupation) AS occupation FROM emp e LEFT OUTER JOIN emp e2 ON (e.occupation = e2.occupation AND e.emp_id <= e2.emp_id) GROUP BY e.emp_id HAVING COUNT(*) <= 3 ORDER BY occupation; 在此示例中
  • 如何在SQL Server中删除重复的行?(How to delete duplicate rows in SQL Server?)
    问题 如何删除不存在unique row id重复行? 我的桌子是 col1 col2 col3 col4 col5 col6 col7 john 1 1 1 1 1 1 john 1 1 1 1 1 1 sally 2 2 2 2 2 2 sally 2 2 2 2 2 2 在重复删除后,我想保留以下内容: john 1 1 1 1 1 1 sally 2 2 2 2 2 2 我已经尝试了一些查询,但是我认为它们依赖于行ID,因为我没有得到期望的结果。 例如: DELETE FROM table WHERE col1 IN ( SELECT id FROM table GROUP BY id HAVING (COUNT(col1) > 1) ) 回答1 我喜欢CTE和ROW_NUMBER因为两者结合使我们能够看到删除(或更新)了哪些行,因此只需将DELETE FROM CTE...更改为SELECT * FROM CTE : WITH CTE AS( SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7], RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1) FROM dbo.Table1 ) DELETE FROM CTE WHERE RN > 1 演示
  • PHP / MySQL的多个查询(php/mysql with multiple queries)
    问题 <?php $query1 = "CREATE VIEW current_rankings AS SELECT * FROM main_table WHERE date = X"; $query2 = "CREATE VIEW previous_rankings AS SELECT rank FROM main_table WHERE date = date_sub('X', INTERVAL 1 MONTH)"; $query3 = "CREATE VIEW final_output AS SELECT current_rankings.player, current_rankings.rank as current_rank LEFT JOIN previous_rankings.rank as prev_rank ON (current_rankings.player = previous_rankings.player)"; $query4 = "SELECT *, @rank_change = prev_rank - current_rank as rank_change from final_output"; $result = mysql_query($query4) or die(mysql_error()); while($row = mysql_fetch
  • 选择语句以查找某些字段上的重复项(Select statement to find duplicates on certain fields)
    问题 您可以通过SQL语句帮助我在多个字段中查找重复项吗? 例如,用伪代码: select count(field1,field2,field3) from table where the combination of field1, field2, field3 occurs multiple times 从上面的陈述中,如果有多次出现,我想选择除第一个记录以外的所有记录。 回答1 要获取具有多个记录的字段列表,可以使用.. select field1,field2,field3, count(*) from table_name group by field1,field2,field3 having count(*) > 1 检查此链接以获取有关如何删除行的更多信息。 http://support.microsoft.com/kb/139444 在使用上面的链接中的方法之前,应该有一个标准来决定如何定义“第一行”。 基于此,您将需要使用order by子句和一个子查询(如果需要)。 如果您可以发布一些示例数据,那将真的有帮助。 回答2 您提到“第一个”,因此我假设您对数据有某种排序。 假设您的数据按某个字段ID排序。 此SQL应该为您获得重复的条目,但第一个条目除外。 它基本上选择所有行,其中另一行具有(a)相同字段,并且(b)具有较低的ID。 性能不会很好
  • Oracle SQL-如何检索列的最高5个值(Oracle SQL - How to Retrieve highest 5 values of a column [duplicate])
    问题 这个问题已经在这里有了答案: Oracle SELECT TOP 10条记录(6个答案) 4个月前关闭。 您如何编写查询,其中仅返回具有最高或最低列值的选定行数。 例如,一份薪水最高的5位员工的报告? 回答1 最好的方法是使用解析函数RANK()或DENSE_RANK()... SQL> select * from ( 2 select empno 3 , sal 4 , rank() over (order by sal desc) as rnk 5 from emp) 6 where rnk <= 5 7 / EMPNO SAL RNK ---------- ---------- ---------- 7839 5000 1 7788 3000 2 7902 3000 2 7566 2975 4 8083 2850 5 7698 2850 5 6 rows selected. SQL> 出现平局时,DENSE_RANK()压缩间隙: SQL> select * from ( 2 select empno 3 , sal 4 , dense_rank() over (order by sal desc) as rnk 5 from emp) 6 where rnk <= 5 7 / EMPNO SAL RNK ---------- ---------- ----------
  • 如何在R中模拟SQL排名函数?(How to emulate SQLs rank functions in R?)
    问题 什么是R等价于排名函数,例如Oracle ROW_NUMBER() , RANK()或DENSE_RANK() (“根据行的顺序将整数值分配给行”;请参见http://www.orafaq.com/node/ 55)? 我同意,每个功能的功能都可以通过临时方式实现。 但是我主要关心的是性能。 出于内存和速度的考虑,最好避免使用联接或索引访问。 回答1 data.table软件包,尤其是从1.8.1版开始的软件包,提供了SQL方面的分区功能。 rank(x, ties.method = "min")与Oracle RANK()相似,并且有一种使用因子(如下所述)来模仿DENSE_RANK()函数的方法。 最后,一种模仿ROW_NUMBER应该显而易见。 这是一个示例:从R-Forge加载data.table的最新版本: install.packages("data.table", repos= c("http://R-Forge.R-project.org", getOption("repos"))) library(data.table) 创建一些示例数据: set.seed(10) DT<-data.table(ID=seq_len(4*3),group=rep(1:4,each=3),value=rnorm(4*3), info=c(sample(c("a","b"),4
  • 如何删除重复的行?(How can I remove duplicate rows?)
    问题 从相当大的SQL Server表中删除重复的行(即300,000+行)的最佳方法是什么? 当然,由于存在RowID标识字段,因此这些行将不是完美的重复项。 我的桌子 RowID int not null identity(1,1) primary key, Col1 varchar(20) not null, Col2 varchar(2048) not null, Col3 tinyint not null 回答1 假设没有空值,则对唯一列进行GROUP BY ,并SELECT MIN (or MAX) RowId作为要保留的行。 然后,只需删除没有行ID的所有内容: DELETE FROM MyTable LEFT OUTER JOIN ( SELECT MIN(RowId) as RowId, Col1, Col2, Col3 FROM MyTable GROUP BY Col1, Col2, Col3 ) as KeepRows ON MyTable.RowId = KeepRows.RowId WHERE KeepRows.RowId IS NULL 如果您使用的是GUID而不是整数,则可以替换 MIN(RowId) 和 CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn))) 回答2
  • 如何使用Spark查找中位数和分位数(How to find median and quantiles using Spark)
    问题 如何使用分布式方法,IPython和Spark查找整数RDD的中位数? RDD大约为700,000个元素,因此太大而无法收集和找到中位数。 这个问题类似于这个问题。 但是,问题的答案是使用Scala,我不知道。 如何使用Apache Spark计算精确的中位数? 使用Scala答案的思想,我试图用Python编写类似的答案。 我知道我首先要对RDD进行排序。 我不知道怎么。 我看到了sortBy (按给定的keyfunc RDD进行排序)和sortByKey (对RDD排序,假定该RDD由(key,value)对组成。)方法。 我认为两者都使用键值,而我的RDD仅包含整数元素。 首先,我正在考虑做myrdd.sortBy(lambda x: x)吗? 接下来,我将找到rdd( rdd.count() )的长度。 最后,我想在rdd的中心找到一个或两个元素。 我也需要这种方法的帮助。 编辑: 我有个主意也许我可以索引我的RDD ,然后键=索引和值=元素。 然后我可以尝试按值排序? 我不知道这是否可能,因为只有sortByKey方法。 回答1 正在进行的工作 SPARK-30569-添加调用percentile_approx的DSL功能 Spark 2.0+: 您可以使用实现Greenwald-Khanna算法的approxQuantile方法: Python : df
  • Use Access SQL to do a grouped ranking
    How do I rank salespeople by # customers grouped by department (with ties included)? For example, given this table, I want to create the Rank column on the right. How should I do this in Access? SalesPerson Dept #Customers Rank Bill DeptA 20 1 Ted DeptA 30 2 Jane DeptA 40 3 Bill DeptB 50 1 Mary DeptB 60 2 I already know how to do a simple ranking with this SQL code. But I don't know how to rework this to accept grouping. Select Count(*) from [Tbl] Where [#Customers] < [Tblx]![#Customers] )+1 Also, there's plenty of answers for this using SQL Server's Rank() function, but I need to do this in
  • 在SQL中选择一个列,不在分组依据中(Select a Column in SQL not in Group By)
    问题 我一直在尝试查找有关如何选择SQL的Group By语句中未包含的非聚合列的信息,但到目前为止,我所发现的任何内容似乎都无法回答我的问题。 我有一张要三列的表格。 一个是创建日期,一个是将记录按特定的Claim ID分组的ID,最后一个是PK。 我想找到在每个索赔ID组中具有最大创建日期的记录。 我正在选择MAX(创建日期)和索赔ID(cpe.fmgcms_cpeclaimid),然后按索赔ID进行分组。 但是我需要这些记录(cpe.fmgcms_claimid)中的PK,如果尝试将其添加到我的select子句中,则会收到错误消息。 而且我无法将其添加到我的group by子句中,因为那样一来它就会脱离我的预期分组。 有人知道任何解决方法吗? 这是我的代码示例: Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid from Filteredfmgcms_claimpaymentestimate cpe where cpe.createdon < 'reportstartdate' group by cpe.fmgcms_cpeclaimid 这是我想要得到的结果: Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, cpe.fmgcms
  • 查找第二大价值的最简单的SQL查询是什么?(What is the simplest SQL Query to find the second largest value?)
    问题 在特定列中查找第二大整数值的最简单的SQL查询是什么? 列中可能有重复的值。 回答1 SELECT MAX( col ) FROM table WHERE col < ( SELECT MAX( col ) FROM table ) 回答2 SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table); 回答3 在T-Sql中,有两种方法: --filter out the max select max( col ) from [table] where col < ( select max( col ) from [table] ) --sort top two then bottom one select top 1 col from ( select top 2 col from [table] order by col) topTwo order by col desc 在Microsoft SQL中,即使所讨论的列是群集的,第一种方法的速度也是第二种方法的两倍。 这是因为与max聚合使用的表或索引扫描相比,排序操作相对较慢。 或者,在Microsoft SQL 2005及更高版本中,您可以使用ROW_NUMBER()函数: select col from ( select ROW