带内部联接的MS-SQL最大ID
我看不见这上面的树木,我相信这很简单。 我试图返回联接表中相关记录的最大ID 表1带内部联接的MS-SQL最大ID,sql,sql-server,Sql,Sql Server,我看不见这上面的树木,我相信这很简单。 我试图返回联接表中相关记录的最大ID 表1 NiD Name 1 Peter 2 John 3 Arthur 表2 ID NiD Value 1 1 5 2 2 10 3 3 10 4 1 20 5 2 15 最大结果 NiD ID Value 1 4
NiD Name
1 Peter
2 John
3 Arthur
表2
ID NiD Value
1 1 5
2 2 10
3 3 10
4 1 20
5 2 15
最大结果
NiD ID Value
1 4 20
2 5 15
3 3 10
您可以为此使用
行编号()
:
select NiD, ID, Value
from (select t2.*,
row_number() over (partition by NiD order by ID desc) as seqnum
from table2 t2
) t2
where seqnum = 1;
正如问题所述,您不需要
table1
,因为table2
拥有所有的ID。我就是这样做的,我认为ID
和Value
在table2没有对应的table1记录条目时将NULL
:
CREATE TABLE Names
(
NID INT,
[Name] VARCHAR(MAX)
)
CREATE TABLE Results
(
ID INT,
NID INT,
VALUE INT
)
INSERT INTO Names VALUES (1,'Peter'),(2,'John'),(3,'Arthur')
INSERT INTO Results VALUES (1,1,5),(2,2,10),(3,3,10),(4,1,20),(5,2,15)
SELECT a.NID,
r.ID,
a.MaxVal
FROM (
SELECT NID,
MAX(VALUE) as MaxVal
FROM Results r
GROUP BY NID
) a
JOIN Results r
ON a.NID = r.NID AND a.MaxVal = r.VALUE
ORDER BY NID
SELECT NiD, ID, [Value]
FROM Table1
OUTER APPLY (
SELECT TOP 1 ID, [Value]
FROM Table2
WHERE Table1.NiD = Table2.NiD
ORDER BY [Value] DESC
) AS Top_Table2
以下是我在类似情况下使用的方法,性能良好,前提是数据集不太大(不超过1M行)
如果需要名称,请修改Gordon的SQL,将t2.nid=table1.nid上的
t2内部联接表1替换为t2
,并更新选择列表以反映您想要的内容。谢谢,这很有魅力,稍微修改一下使用内部联接,因为其他表是依赖的。
SELECT
table1.nid
,table2.id
,table2.value
FROM table1
INNER JOIN table2 ON table1.nid = table2.nid
WHERE table2.value = (
SELECT MAX(value)
FROM table2
WHERE nid = table1.nid)
ORDER BY 1