【问题标题】:SQL Query/Sub-query help needed需要 SQL 查询/子查询帮助
【发布时间】:2012-11-30 16:50:59
【问题描述】:

我正在尝试从 SQL Server 2005 上的测试信息表中获取最后 10 个序列号的列表。我尝试了如下操作:

SELECT DISTINCT TOP (10) Serial, DateTime
FROM [Test].[dbo].[TestInfo]
WHERE (TestedBy = 'JSMITH') ORDER BY DateTime DESC

返回重复序列:

+---------+-------------------------+
| Serial  | DateTime                |
+-----------------------------------+
| 1114048 | 2011-03-16 11:03:14.000 |
| 1617683 | 2011-03-11 15:07:29.000 |
| 1617683 | 2011-03-11 15:07:27.000 |
| 1617683 | 2011-03-11 15:07:26.000 |
| 1617683 | 2011-03-10 13:16:04.000 |
| 1617683 | 2011-03-10 13:15:35.000 |
| 1617683 | 2011-03-10 13:15:30.000 |
| 1617683 | 2011-03-07 13:42:48.000 |
| 1617683 | 2011-03-07 13:40:32.000 |
| 1617683 | 2011-03-07 13:37:58.000 |
+---------+-------------------------+

有没有办法,使用查询或子查询来获取最后 10 个不重复的序列?

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:
    select top (10) Serial, Max(DateTime)
    from [Test].[dbo].[TestInfo]
    where (TestedBy = 'JSMITH')
    group by Serial
    order by Max(DateTime) desc
    

    【讨论】:

    • 我接受了你的回答,但我从 SELECT 部分删除了 Max(DateTime),因为我真的只需要序列列表:SELECT TOP (10) Serial FROM [Test].[dbo] .[TestInfo] WHERE (TestedBy = 'JSMITH') GROUP BY Serial ORDER BY Max(DateTime) DESC
    【解决方案2】:
    SELECT TOP 10 
      * 
    FROM (SELECT 
            Serial, 
            MAX(DateTime) AS DateTime
          FROM [Test].[dbo].[TestInfo]
          WHERE (TestedBy = 'JSMITH') 
          GROUP BY Serial) q1
    ORDER BY q1.DateTime DESC
    

    【讨论】:

      【解决方案3】:

      大概是这样的:

      SELECT DISTINCT TOP (10) Serial, DateTime
      FROM (
        SELECT Serial, MAX(DateTime) AS DateTime
        FROM [Test].[dbo].[TestInfo]
        WHERE (TestedBy = 'JSMITH') 
        GROUP BY Serial
      ) AS sub
      ORDER BY DateTime DESC
      

      【讨论】:

        【解决方案4】:

        它返回重复的行,因为每行的日期时间不同。 如果您只需要序列字段,则必须在查询中只写序列字段。

        【讨论】: