【问题标题】:SQL Server : select max year [duplicate]SQL Server:选择最大年份[重复]
【发布时间】:2019-05-02 20:52:02
【问题描述】:

我有一个相当大的数据表,其中包含多年的帐户。我正在尝试编写一个简单地回溯最近一年的查询。

但是我已经尝试了一些查询,其中一些来自该站点的查询似乎适用于其他查询,但我无法让它在我的数据集上工作。

表格数据如下:

所以在这个例子中,我只需要带回 2018 年。我认为可能有效的查询是:

SELECT *
FROM dbo.Accounts A     
INNER JOIN  
    (SELECT [Account No], MAX(Year) AS MaxYear 
     FROM dbo.Accounts
     GROUP BY [Account No]) MaxYear ON A.[Account No] = MaxYear.[Account No] 
                                    AND A.Year = MaxYear.MaxYear

但是,当我查找上面的示例帐号时,这仍然为我提供了 Max 部分的三个记录。

任何帮助将不胜感激。

提前致谢

PS:Year 数据类型是 FloatAccount Nonvarchar(255)

【问题讨论】:

  • this still provides me three records on the Max part when I look for the example account number above 是指 2018、2017、2016 年的 3 条记录,还是每行 2018 年的 3 条记录?
  • 样本输入???预期输出???

标签: sql sql-server


【解决方案1】:

那么在子查询中不要按账号分组?

SELECT *
FROM dbo.Accounts A     
INNER JOIN  
    (SELECT MAX(Year) AS MaxYear 
    FROM dbo.Accounts
    ) MaxYear

ON A.Year = MaxYear.MaxYear

通过按帐号分组(然后加入),您将获得每个帐户的最长年份,而不是整个表格的最长年份。

【讨论】:

  • 谢谢,但这不起作用,因为我有数千个历史账户,其中一些在 2016 年、2017 年、2018 年结束。这会丢失大量数据,因为它只会在 2018 年的最大年份加入。我需要找到每个帐号的最近年份。
  • @Carlos80,你应该在你的问题中澄清这一点
  • @Carlos80 THAT 正是您已经拥有的。屏幕截图中的三个记录用于不同的帐户。
  • MatBailie,谢谢,你是对的,这是我已经拥有的原始数据集,因此在该示例中,您可以看到我们在 2016 年、2017 年和 2018 年有该帐户的记录。这是同一个帐户,所以我只是想拉出最近的一年,这将是 2018 年的一行。
  • @Carlos80 - 不...这三行都有不同的帐号...您将获得每个帐户的最新年份,来自三个不同的帐户,即三个不同的行...如果它们是同一个帐户,那么您遇到的问题是 (至少) 三个 不同 同一个账号的账号,完全是FUBAR,那个是需要修复的。
【解决方案2】:

试试下面:

SELECT * FROM dbo.Accounts where Year = (Select Max(Year) FROM dbo.Accounts)

【讨论】:

  • 谢谢,但这不起作用,因为我有数千个历史账户,其中一些在 2016 年、2017 年、2018 年结束。这会丢失大量数据,因为它只会在 2018 年的最大年份加入。我需要找到每个帐号的最近年份。
  • @Carlos80 我没有在查询中使用任何 Join。另外,所有的历史记录都在同一张表中,对吧?并且您想知道最近一年开设的帐户,对吗?
  • 嗨,Sonal,这是正确的,很抱歉,我知道你并没有加入我的坏话。当我对我的数据表运行这个时,我只得到 2019 年的行,仅此而已,所以没有得到任何最后一次出现在 2016、2017、2018 年的帐户。我不只是想要看到每个帐户的最后一年的最大年份。谢谢
【解决方案3】:

你可以试试下面的

SELECT A.*
FROM dbo.Accounts A where A.Year= (select max(year) from dbo.Accounts)

使用顶部

select TOP(1) WITH TIES * from dbo.Accounts
order by Year desc

【讨论】:

  • 是的,这两种解决方案都是可能的。这取决于哪个更好,因此您对这两种解决方案的回答都很棒:)
  • 但是第二个只会返回一行听起来不对的行
  • SELECT TOP 1 with ties * from dbo.Accounts order by Year desc
【解决方案4】:

据我了解,年份是 accountNo 列的一部分,这意味着只有第一部分是真实帐号,并且您希望每个帐户的最大(最后)年份

SELECT AccountNo, max_year
FROM Accounts
JOIN (SELECT substring(accountno, 1, 6) as accno, max(year) max_year
      FROM accounts
      group by accno) as max_acc ON max_acc.accno = substring(accountno, 1, 6) AND year = max_year

【讨论】:

  • 感谢您的评论 Joakim,我希望这会奏效,因为您已经掌握了它。即使帐号看起来不同,它们也是同一个帐户,只是年份参考不同。但是,运行您的代码(并且完全有意义)它仍然会拉回所有三个记录,而不仅仅是最大年份(2018 年)的记录,这始终是我最初的问题。
  • 它在我运行时有效,所以我的示例数据一定不正确,您能否添加更多示例数据来说明您的问题。这是我的测试,[db-fiddle](dbfiddle.uk/…)
  • @Carlos80,请检查我的 db-fiddle
猜你喜欢
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2017-08-11
  • 2013-05-26
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多