【问题标题】:Selecting all rows with highest (relative) timestamp选择具有最高(相对)时间戳的所有行
【发布时间】:2010-11-03 17:29:44
【问题描述】:

我在 SQL 2000 数据库中有以下简化的表结构:

ID  AppName  Key    Value   EffectiveDate
--  -------  -----  ------- -------------
1   App1     One    Past    1/1/1900
2   App1     One    Present 1/1/2010
3   App1     One    Future  1/1/9999
4   App1     Two    Past    1/1/1900
5   App1     Two    Present 1/1/2010
6   App1     Two    Future  1/1/9999
7   App2     One    Present 1/1/2010
8   App2     Two    Present 1/1/2010

我需要能够提出问题:

给定一个特定的AppName,显示所有只有最近的键/值对,其EffectiveDate <= GetDate()

因此,如果我使用 AppName = 'App1' 调用我的神秘查询,那么我的结果将是:

ID  AppName  Key    Value   EffectiveDate
--  -------  -----  ------- -------------
2   App1     One    Present 1/1/2010
5   App1     Two    Present 1/1/2010

编辑:

值可以是任何东西。 ('Past','Present','Future') 仅用于使示例更清晰。他们很可能是 (45,'Bob','%$#%@#$')。

【问题讨论】:

  • 感谢您告诉我们,但这是一个问答网站。你有问题吗?
  • 显示的示例结果与所述条件不匹配 - “过去”和“当前”记录都具有 EffectiveDate
  • 好的,所以我意识到我的问题措辞不当。我曾希望我的例子很清楚。 @Mark - 把它放在头上,因为我只想要组中时间戳最高的那些记录。结果集中不应有任何键重复。

标签: sql tsql sql-server-2000


【解决方案1】:

我认为你需要使用这样的东西:

SELECT T3.*
FROM your_table T4
JOIN
(
    SELECT T2.[Key], T2.EffectiveDate, MAX(T2.ID) AS ID
    FROM your_table T2
    JOIN 
    (
        SELECT [Key], MAX(EffectiveDate) AS EffectiveDate
        FROM your_table
        WHERE AppName = 'App1'
        AND EffectiveDate <= GetDate()
        GROUP BY [Key]
    ) T1
    ON T1.[Key] = T2.[Key] AND T1.EffectiveDate = T2.EffectiveDate
    WHERE T2.AppName = 'App1'
    GROUP BY T2.[Key], T2.EffectiveDate
) T3
ON T3.ID = T4.ID

【讨论】:

  • 价值可以是任何东西......我试图通过我的例子来帮助说明:)
  • 您只需删除 Value 条件即可。 SELECT * FROM your_table WHERE AppName = 'App1' AND EffectiveDate
  • 好的,我知道我的问题措辞不当
  • @Josh:我想我现在明白你的问题了。除了只想考虑每个组中与谓词匹配的行之外,您还需要一个 groupwise-maximum。
  • 太棒了!我现在意识到,当我上大学的时候,我应该更加关注,他们正在研究所有的关系代数。
【解决方案2】:

类似这样的东西来获取最新的相对日期。

SELECT *
FROM your_table
WHERE AppName = 'App1'
AND DATE = (SELECT MAX(EffectiveDate ) 
             FROM your_table
             WHERE APPName = 'App1'
              AND EffectiveDate <= GetDate())

【讨论】:

  • +1 @Turnkey,我认为子查询还应该链接回Key 上的主查询 - 同一应用程序的不同键可能有不同的生效日期(尽管在示例中没有.)
  • 这不会只返回一条记录吗?
  • 没错,它只会返回具有该 AppName 的最大日期的行,以便对其进行分组 Mark's got the correct way.
【解决方案3】:

似乎是一个相当基本的 SQL 查询:

select *
from App
where AppName = 'App1'
    and EffectiveDate <= GetDate()

有很多关于 SQL 查询的信息,但这是一个很好的入门:http://www.w3schools.com/sql/sql_where.asp

【讨论】:

  • 抱歉,我的问题措辞不当。我希望这个例子能让规范变得清晰。这会给我重复的键。
【解决方案4】:

您需要定义“礼物”是什么。是最后一年吗?过去十年?

您的查询将如下所示

SELECT *
FROM your_table
WHERE EffectiveDate <= GetDate()
--This is where you need to define what "Present" is
AND EffectiveDate > DateAdd(YY, -1, GetDate()) 
AND AppName = 'App1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多