我正在尝试编写一个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)
答案 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