【问题标题】:SQL Timestamp to INT,newest recordSQL时间戳到INT,最新记录
【发布时间】:2018-12-05 09:43:06
【问题描述】:

我在转换时间戳列时遇到问题,值示例:

val  name   timestamp
1    adam   01-NOV-12
2    adam   02-DEC-13
3    adam   01-DEC-12

我需要结果:

val  name   timestamp
2    adam   02-DEC-13

我想为列中的 DISTINCT 值选择最新记录

我尝试了SELECT CAST(timestamp AS DATE) as TIME,但没有成功

我也尝试过TIMESTAMPDIFF(),但只有当格式像这样时它才对我有用:

'001-01-01 00:00:00'

谁能帮我将此值(10-AUG-12)转换为 INT?

或者也许没有转换我可以从这个表中选择使用实际时间戳的最新记录?

编辑:

我试过ORDER_BY timestamp DESC

但它给了我输出:

val  name   timestamp
2    adam   02-DEC-13
1    adam   01-DEC-12
3    adam   01-NOV-12

【问题讨论】:

  • 使用 order by 选择最新记录应该很容易,如果您发布示例数据和您正在尝试的更详细的逻辑会更好
  • select * from the_table order by timestamp desc fetch first 1 rows only

标签: sql oracle


【解决方案1】:

你可以使用FIRST聚合函数(KEEP...DENSE_RANK

select MAX(VAL) KEEP ( DENSE_RANK FIRST ORDER BY TIME_STAMP DESC ) as Val,
       Name,
       MAX(TIME_STAMP) FROM t
       GROUP BY Name;

或相关子查询

SELECT *
  FROM t o
WHERE time_stamp = (
        SELECT MAX(time_stamp)
        FROM t i
        WHERE i.name = o.name
        );

row_number() 技术如其他答案所示。

【讨论】:

  • 为什么要使用in 而不是=
  • @GordonLinoff :当然..我会成功的=。默认情况下使用IN 进行子查询是一种习惯;-)
  • 。 .我认为这是一个坏习惯。它可能会影响优化。
  • @Kaushik Nayak 嘿,t ot i 是什么意思?在FROM t o FROM t oi 也在WHERE i.name = o.name 谢谢
  • @sygneto : oi 是表别名,用于区分对子查询内外表的引用。 t 是任何表名。您应该将其用作 yourtablename iyourtablename o 。 Google 关联子查询以了解更多信息
【解决方案2】:

您可以尝试使用ROW_NUMBER窗口功能。

SELECT val,name,timestamp
FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY name ORDER BY timestamp desc) rn
    FROM T t1
) t1
where rn = 1

【讨论】:

  • 当我们在第 4 行将 FROM T t1 更改为 FROM t1 时,此答案有效,谢谢
  • 你好,你能告诉我更多,如何将它用于多个表吗?我正在尝试使用内部联接添加另外两个表,但它现在正在工作;/你能给我一个提示吗?谢谢
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2014-04-07
  • 2020-07-30
  • 2015-09-29
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多