【问题标题】:Return most recent data返回最新数据
【发布时间】:2014-07-27 01:46:30
【问题描述】:

我有一个数据库表,其结构如下:

CREATE table match (ID1 int, ID2 int, CreatedDate, ConnectDisconnect)

我正在尝试编写一条 SQL 语句,该语句将返回按 id1 和 id2 分组的最新重新匹配记录。例如,请看下面的数据:

1,2,'2014-06-05', C
1,3,'2014-06-05', C
1,4,'2014-06-05', C
N1,N2,'2014-06-05',D

请看下面的SQL语句:

select max(CreatedDate), ID1,ID2 FROM match
group by ID1,ID2

这将显示最近对 ID1 和 ID2 做出的决定。问题是匹配的记录可以是任何一种方式。例如:

1,2,'2014-06-04', C
2,1,'2014-06-05', D

上面的数据显示,记录 1 和 2 在 04/06/2014 连接,在 05/06/2014 断开连接。我上面的查询将返回两行,但我只希望它返回一行,即最近的一行(在上面的例子中是 05/06/14 的数据)。

【问题讨论】:

  • 好吧,如果你只有一个日期列(不是日期时间),那么你怎么知道哪一行是最近的?

标签: sql sql-server


【解决方案1】:

这是一种方法,使用caserow_number()

select m.*
from (select m.*,
             row_number() over (partition by (case when id1 < id2 then id1 else id2 end),
                                             (case when id1 < id2 then id2 else id1 end)
                                order by CreatedDate desc
                               ) as seqnum
      from match m
     ) m
where seqnum = 1;

【讨论】:

  • 抱歉耽误了审查。 ID 并不总是整数,例如N1、N2 等。因此我不相信这会起作用。我已经更新了这个问题。你同意吗?
  • (1) 问题clearly 指定ids 是整数。 (2) 没关系,只要为类型定义了&lt;(并且是为SQL基类型定义的)。
【解决方案2】:

这很丑,但这可能会做你想要的(不确定 SQL Server 中连接的语法是什么):

select max(CreatedDate), case when ID1 < ID2 concat(ID1,',',ID2) else concat(ID2,',',ID1) end as combinedIds
FROM match
group by case when ID1 < ID2 concat(ID1,',',ID2) else concat(ID2,',',ID1) end

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 2021-02-05
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-09-23
    • 2014-11-06
    相关资源
    最近更新 更多