【问题标题】:SQL Query to Obtain the Oldest PeopleSQL查询获取最年长的人
【发布时间】:2021-06-27 12:59:22
【问题描述】:

我正在尝试在我的数据库中查找最老的客户。我只想要他们的全名和年龄,但我目前的结果是输出所有客户和他们的年龄(不仅仅是最老的)。我在这里做错了什么?

SELECT 
        LTRIM(CONCAT(' ' + Prefix, ' ' + FirstName, 
        ' ' + MiddleName, ' ' + LastName, ', ' + Suffix)),
        MAX(DATEDIFF(year, BirthDate, GETDATE()))
    FROM
        Customers
    WHERE 
        BirthDate is not null
    GROUP BY
        Prefix, FirstName, MiddleName, LastName, Suffix
    ORDER BY
        MAX(DATEDIFF(year, e.BirthDate, GETDATE())) desc

请注意,似乎有多个客户的最大年龄相同。

【问题讨论】:

  • 能否提供样本数据和所需结果。我猜,GROUP BY 应该看起来像 GROUP BY LTRIM(CONCAT(' ' + Prefix, ' ' + FirstName, ' ' + MiddleName, ' ' + LastName, ', ' + Suffix))
  • 考虑使用TOP(n)TOP(n) PERCENT 来限制您的结果集。 docs
  • 谷歌有条款。
  • 定义“最年长的” - 除非您有多个具有相同出生日期的人,否则只会有一个人。您只是想按年龄顺序列出前几名吗?
  • 如果您想将结果限制在某个条件下,那么您还需要提供该条件。您查询中的唯一条件是生日不能为空。

标签: sql sql-server max aggregate-functions


【解决方案1】:

在执行其他任何操作之前,您需要做的第一件事是在客户表上定义一个唯一的数字主键。

ALTER TABLE Customers ADD Cust_Id int IDENTITY(1,1);
ALTER TABLE Customers ADD CONSTRAINT PK_Customers PRIMARY KEY (Cust_Id);

完成此操作后,以下代码将为您提供“数据库中最老的客户(或多个客户)”。

With qry1 As (
    SELECT      Cust_Id, 
                DATEDIFF(year, BirthDate, GETDATE()) As Age
    FROM        Customers 
    WHERE       BirthDate is not null 
),
qry2 As (
    SELECT      Max(Age) As Max_Age
    FROM        qry1
)
SELECT      Customers.Cust_Id,
            Customers.Prefix,
            Customers.FirstName,
            Customers.MiddleName,
            Customers.LastName,
            Customers.Suffix,
            Qry1.Age
FROM        Customers
Inner Join  Qry1 On Customers.Cust_Id = Qry1.Cust_Id
Inner Join  Qry2 On Qry1.Age = Qry2.Max_Age

【讨论】:

    【解决方案2】:

    您尚未定义“最老客户”的含义。
    所以我会给出一些你可以尝试的选项

    要查看年龄最大的客户列表,请使用这样的简单查询

    SELECT FirstName, LastName, Suffix, BirthDate
    FROM   Customers
    WHERE  BirthDate is not null
    ORDER BY BirthDate desc
    

    要将结果限制为多行,例如最旧的 10 行,请使用 top 10

    SELECT top 10
           FirstName, LastName, Suffix, BirthDate
    FROM   Customers
    WHERE  BirthDate is not null
    ORDER BY BirthDate desc
    

    要将结果限制在特定日期之后出生的所有客户,请添加到 where 子句

    SELECT FirstName, LastName, Suffix, BirthDate
    FROM   Customers
    WHERE  BirthDate is not null
    and    BirtDate < '19920101'
    ORDER BY BirthDate desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多