返回具有MAX Rev值的行

时间:2014-11-12 14:49:29

标签: sql-server

我正在尝试编写一个SQL语句来返回表中最新引用修订版的所有行。例如,下表中的查询

Quote    QuoteBase  QuoteRev
2500-01    2500       01
2600-01    2600       01
2600-02    2600       02
2600-03    2600       03
2700-01    2700       01
2700-02    2700       02

我会得到以下结果

Quote   QuoteBase   QuoteRev
2500-01    2500       01
2600-03    2600       03
2700-02    2700       02

我已尝试过以下声明,但对我不起作用。

SELECT *
FROM [QuoteTable]
GROUP BY Quote
HAVING QuoteRev = MAX(QuoteRev)

4 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER()函数,将输出限制为每个不同值只有一行。

示例:

SELECT 
   Quote, QuoteBase, QuoteRev
FROM (
   SELECT 
      ROW_NUMBER() OVER (
        PARTITION BY QuoteBase
        ORDER BY QuoteRev DESC
      ) RN,
      Quote, QuoteBase, QuoteRev
   FROM tableName
) T
WHERE RN = 1

ROW_NUMBER()函数会给结果集的每一行增加一个数字, while PARTITION BY子句将为每组不同的值提供一个独立的行号,按ORDER BY子句中设置的值排序。

应用最终WHERE将返回QuoteBase中每个不同值的顶行。

答案 1 :(得分:0)

;WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY Quote ORDER BY QuoteRev DESC)
    FROM dbo.YourTable
)
SELECT *
FROM CTE
WHERE RN = 1;

答案 2 :(得分:0)

如下:

SELECT Q1。* 来自QuoteTable Q1 内部加入QuoteTable Q1s Q1s.Quote = Q1 .Quote和Q1s.QuoteRev> Q1.QuoteRev 其中Q1s.Quote IS NULL

答案 3 :(得分:0)

我们可以通过对值进行分组并采用最大条件来实现这一目标

declare @t table (Quote varchar(20),Quotebase INT,QuoteRev VARCHAR(3))

    insert into @t (Quote,Quotebase,QuoteRev)values 
    ('2500-01',2500,'01')
    ,('2600-01',2600,'01'),
    ('2600-02',2600,'02'),
    ('2600-03',2600,'03'),
    ('2700-01',2700,'01'),
    ('2700-02',2700,'02')


    select MAX(Quote),Quotebase,MAX(P.QuoteRev)QuoteRev
     from 
       (select Quote,
    Quotebase,
    QuoteRev,
    MAX(SUBSTRING(Quote,0, CHARINDEX('-',Quote)))R
     from @t
    GROUP BY Quote,
    Quotebase,
    QuoteRev)P
    GROUP BY Quotebase