如果它们具有相同的表名和不同的表_PK

时间:2019-05-30 05:46:00

标签: sql

我想获取多个TableName的最后更改记录,并仅显示一次。 对于某些TableName,我有多个Table_Pk,用于exp:

SELECT COUNT(Table_PK), TableName
FROM TBL_TECTABLES INNER JOIN
     sys.tables
     ON 'TBL_Tec' + Table_PK = name collate SQL_Latin1_General_CP1_CI_AS
WHERE LEN(name) = 39 
GROUP BY TableName 
HAVING COUNT(Table_PK) > 1

结果如下:

Table_PK   TableName
   9       L0L001T03
   2       L0L001T05
   ....

我想按LastChanged的命令获取Table_Pk,TableName。

这是我尝试过的代码,但我得到了所有记录

SELECT  Distinct(Table_PK), TableName, LastChanged
FROM TBL_TECTABLES INNER JOIN
     sys.tables
     ON 'TBL_Tec' + Table_PK = name collate SQL_Latin1_General_CP1_CI_AS
WHERE LEN(name) = 39 
ORDER BY LastChanged 

结果是:

Table_Pk                            TableName            LastChanged
91A5249DB797FF4BB44579AC7D3C0949    L0L003T41             2019-05-29
7070D39FAF65674DA8537B93FFDE2371    L0L003T41             2019-05-28 
......

我应该有1153行,但我有2220行

2 个答案:

答案 0 :(得分:1)

如果只希望每个表名最新记录,则可以对表名使用窗口函数分区:

R3

我添加了表别名,但不得不猜测列的来源。您可能需要调整表别名。

答案 1 :(得分:0)

我猜你需要下面的查询:

SELECT * from ( 
SELECT  Table_PK, TableName, LastChanged, row_numbeR() over(partition by table_pk order by lastchanged desc) as RN FROM TBL_TECTABLES 
INNER JOIN sys.tables ON 'TBL_Tec' + Table_PK = name 
collate SQL_Latin1_General_CP1_CI_AS WHERE LEN(name) = 39 ) a Where RN = 1