T-SQL 收集相同的数字

T-SQL gather same numbers

嘿,我需要在我的 SQL Server 2016 数据库中合并类似的数字。

我的table结构:

--------------------------------
|ID  |number |lastModifiedDate |
--------------------------------
|124 |1      |Mar 27 2018 9:10AM
|124 |2      |Mar 27 2018 9:22AM
|124 |2      |Mar 27 2018 9:22AM
|124 |3      |Mar 27 2018 9:35AM
|124 |4      |Mar 27 2018 9:35AM
|124 |4      |Mar 27 2018 9:38AM
|124 |5      |Mar 27 2018 10:04AM
|124 |5      |Mar 27 2018 10:05AM

在上面的示例 table 中,我正在寻找看起来像这样的输出(请注意,它显示了最新的 date/time 它找到的许多相同数字的行):

|124 |1      |Mar 27 2018 9:10AM
|124 |2      |Mar 27 2018 9:22AM
|124 |3      |Mar 27 2018 9:35AM
|124 |4      |Mar 27 2018 9:38AM
|124 |5      |Mar 27 2018 10:05AM

在这里使用这个查询:

SELECT 
    id,
    CONCAT(number, ' (', lastModifiedDate, ')') AS name
FROM 
    bLine 
WHERE 
    LINK_userTblID = 1 
AND 
    stage = 1
GROUP BY 
    number, id, lastModifiedDate

只输出与我上面的第一个 table 示例相同的数据... 我只能有 2 个输出列名称 - 即 ID 和名称 .

我试过在数字上使用 distinct,但这似乎不起作用。

帮助解决我的问题会很棒! :)

select id, number, max(lastmodifieddate)lastmodifieddate
from yourtable
group by  id, number
order by number

如果你想要两个输出列并将时间戳附加到数字,你可以这样做:

;with cte AS (
SELECT id, 
number, 
MAX(lastmodifieddate) AS mod_date
FROM your_table
GROUP BY id, number
)

SELECT id, 
CAST(number AS VARCHAR(10)) + ' ' + CAST(mod_date AS VARCHAR(50)) AS new_col
FROM cte

您只需将查询修改为:

SELECT id, CONCAT(number, ' (', MAX(lastModifiedDate), ')') AS name
FROM bLine 
WHERE LINK_userTblID = 1 AND  stage = 1
GROUP BY number, id;

重要的一点是 lastModifiedDate 不应该出现在 GROUP BY 子句中。相反,它应该是聚合函数的参数。

此外,您可能希望使用 CONVERT()FORMAT() 将日期转换为字符串,而不是依赖默认参数。

还有一个选择

Select Top 1 with Ties 
       ID
      ,Name = CONCAT(number, ' (', lastModifiedDate, ')')
 From  bLine
 Where LINK_userTblID = 1 and  stage = 1
 Order by Row_Number() over (Partition By ID,number Order by lastModifiedDate Desc)

Returns

ID  Name
124 1 (Mar 27 2018  9:10AM)
124 2 (Mar 27 2018  9:22AM)
124 3 (Mar 27 2018  9:35AM)
124 4 (Mar 27 2018  9:38AM)
124 5 (Mar 27 2018 10:05AM)

Updated for comment

Select Top 1 with Ties 
       ID
      ,number
      ,lastModifiedDate
 From  bLine
 Where LINK_userTblID = 1 and  stage = 1
 Order by Row_Number() over (Partition By ID,number Order by lastModifiedDate Desc)