【问题标题】:TSQL Distinct ColumnTSQL 不同的列
【发布时间】:2014-09-16 19:28:30
【问题描述】:

我有一个从表中选择员工的查询。

该表是一个历史表,因此它可以包含同一个人的记录。始终相同的一条数据是A.[qid]。员工姓名可能会更改,因此它会插入另一条记录更改。

我正在尝试为员工选择最近的记录,这就是我通过A.[Meta_LogDate] 订购的原因。但是,我只想包含员工的 1 条记录,而不是全部记录。

当我搜索时,我希望它给我这个表中最近的记录。

我认为我做不到Top,因为这是一个 ajax 调用,它会在您键入时缩小员工范围,所以我需要确保列表仍然显示所有可能的选项,而不是重复。

SELECT   DISTINCT(A.[qid]),
         A.[FirstName],
         A.[LastName],
         A.[ntid],
         A.[Meta_LogDate]
FROM     EmpTable_historical AS A
WHERE    A.[LastName] + ', ' + A.[FirstName] LIKE '%' + @name + '%'
ORDER BY A.[LastName], A.[Meta_LogDate] DESC
FOR      XML PATH ('emp'), TYPE, ELEMENTS, ROOT ('results');

【问题讨论】:

  • 我认为您的问题与我的类似:stackoverflow.com/questions/25855021/…
  • 如果您将其用于自动完成字段,则查询历史数据库并在每次击键时进行过滤和排序会大大降低性能。最好有一个“实时”或“当前”表,并且可能还有一个 FREETEXT 索引以提供更有效的文本匹配。

标签: sql-server tsql stored-procedures


【解决方案1】:
;WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY qid ORDER BY Meta_LogDate DESC)
    FROM EmpTable_historical 
    WHERE [LastName] + ', ' + [FirstName] LIKE '%' + @name + '%'
)
SELECT *
FROM CTE
WHERE RN = 1

【讨论】:

    猜你喜欢
    • 2016-06-03
    • 2011-05-04
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多