【问题标题】:How to get the following data via a SQL Server query如何通过 SQL Server 查询获取以下数据
【发布时间】:2013-10-26 15:38:47
【问题描述】:

使用以下数据,如何编写 SQL 服务器查询以仅获取下面标有“X”的记录?基本上,我想要每组相似记录的 MAX 日期记录。下面有两组;第一个只有 KEY1 中的数据,第二个在 KEY1 和 KEY2 中都有数据。我尝试使用 OVER 语句,但可以得到我需要的东西。谢谢。

日期------KEY1-----KEY2

01-Jan......abc.............NULL

02-Jan......def............NULL 'X'

12-2月......abc............123

2 月 14 日......abc............456 'X'

所以这里用更真实的数据集重新表述问题。

行日期率 Key1 Key2 Key3 1 01-1 月 150 12345 2 05-1月155 12345 3 160 年 1 月 1 日 12345 J100 4 07-2月 170 12345 J100 5 170 年 1 月 9 日 12345 K200 6 150 年 1 月 14 日 12345 J100 ABC 7 175 年 1 月 23 日 12345 J100 ABC

我想要获取的行是 2、4、5 和 7,因为它们各自代表三个键列的每个唯一组合的最大日期。希望这更有意义。谢谢。

【问题讨论】:

  • 基本上,你想要一个查询 max(date) 并按键 1 分组,对吧??
  • 一组是在 key1 中使用 'abc' 的三行 - 而另一组是在 key1 中使用 'def' 的单行吗?
  • 我不应该使用 'abc' 作为 KEY1 的第四行值,因为它混淆了问题。记录按它们是否仅包含 KEY1 中的值或同时包含 KEY1 和 KEY2 进行分组。所以在示例中,记录 1 和 2 是 group1,记录 3 和 4 是 group 2。
  • 我想我搞砸了这个数据示例,所以问题是错误的。我会尽快用正确的数据再试一次,并改写我的问题
  • 这是我在面试时经常问的问题之一,当人们来声称他们知道 SQL =)

标签: sql sql-server


【解决方案1】:
select distinct LAST_VALUE(date) over (partition by key1, key2, key3 order by date) date,
                LAST_VALUE(rate) over (partition by key1, key2, key3 order by date) rate,
                LAST_VALUE(key1) over (partition by key1, key2, key3 order by date) key1,
                LAST_VALUE(key2) over (partition by key1, key2, key3 order by date) key2,
                LAST_VALUE(key3) over (partition by key1, key2, key3 order by date) key3
from t1

请注意,这仅适用于 SQL Server 2012。

其他版本

  select t1.* 
    from t1, (select key1, key2, key3, max(date) date from t1 group by key1, key2, key3)) t2
where t2.key1 = t1.key1 and t2.key2 = t1.key2 and t2.key3 = t1.key3 and t2.date = t1.date

【讨论】:

  • 我已经改写了问题并添加了一个更好的数据示例。目前上述查询没有取回我需要的数据。
  • 我已更改查询以反映您的要求。诀窍是定义另一个可用于分组的字段。您可以不使用 CTP 并按 case 语句分组,但这看起来很丑陋和可怕。
  • 谢谢,我会试一试,因为它看起来确实比我的 hack 更优雅。
  • 不幸的是,这个查询在我的真实数据集中只返回了 3 行,其中只有 key1 被填充的最大日期,key1 和 key2 被填充,并且所有 3 个键都被填充。我需要它为表中 1、2 或 3 个键的每个唯一组合返回最大日期行。
  • 我已经修复了查询。这些应该可以。
【解决方案2】:

这很难看,但它确实对我有用。

select r.rate, t1.* from tRate r
join (select max(r.date) date, r.key1, r.key2, r.key3 from tRate r
join (select distinct key1+key2+key3 newKey from tRate) t2 on r.key1+r.key2+r.key3 = t2.newKey group by r.key1, r.key2, r.key3) t1
on r.date = t1.date and r.key1 = t1.key1 and r.key2 = t1.key2 and r.key3 = t1.key3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多