【问题标题】:ROW_COUNT Equivalent for Intersystems Cache?ROW_COUNT 等效于跨系统缓存?
【发布时间】:2016-07-05 15:10:05
【问题描述】:

我需要运行一个查询,该查询返回每个客户端最近更新的行。

在 SQL Server 中,我会执行以下操作:

SELECT * 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY date_updated DESC) AS rn
    FROM client_address
) a
WHERE a.rn = 1

在 Intersystems Cache 上是否有类似的方法来执行此操作?我没有找到任何类型的排名函数的任何文档。

【问题讨论】:

    标签: intersystems-cache


    【解决方案1】:

    我查看了the docs,但它似乎不是 SQL Server、Oracle 或 Postgres 中存在的任何 Window 函数,因此您无法使用 ANTI-THETA-SELF-JOIN 解决方案。

    SELECT *
    FROM 
       client_address a
       LEFT JOIN client_address b
       on a.client_id  = b.client_id 
         and a.date_updated < b.date_updated 
    WHERE
       b.client_id is null
    

    【讨论】:

    • 不知道为什么这被否决了。它在某些方面不正确吗?例如缓存不支持这个表达式?它没有做操作想要的?
    • 不知道为什么它也被否决了。它完成了这项工作。
    • 我只是通过查看查询来猜测,如果有 > 1 行具有相同的时间戳,它将全部返回。我说的对吗?
    • 是的,这里没有决胜局。
    • 查看Tim Leavitt 的回答。他的回答很到位,并提供了适当的窗口结果集。
    【解决方案2】:

    the documentation for HAVING。在这种情况下如何使用它:

    SELECT *
    FROM client_address
    GROUP BY client_id
    HAVING date_updated = MIN(date_updated)
    

    【讨论】:

    【解决方案3】:

    您可以使用%vid 变量。例如:

    SELECT *, %vid FROM (SELECT * FROM Sample.Person) WHERE %vid BETWEEN 5 AND 10

    将从 Sample.Person 表中返回第 5-10 行。

    Documentation.

    Discussion on InterSystems Caché developer community.

    【讨论】:

    • 你能多解释一下如何解决我的问题吗?我运行了这个,只得到了五行,数据集包括多行用于同一个客户端,这不是我要寻找的行为。
    • 这是每组前 1 个问题,不是分页问题
    【解决方案4】:

    在投票之前!!!!我只是问这是否可行。根据我过去的做法,这更像是一种学习。我可能不明白这个问题,宁愿删除或讨论也不愿投反对票:)

    SELECT *
    FROM client_address a
    WHERE
    a.date_updated = 
    (
    SELECT max(b.date_updated) FROM client_address b
    group by b.Client_id
    )
    

    【讨论】:

    • 我认为这行不通。除了最大日期之外,没有任何东西将子查询连接到主查询。如果您在子查询中包含 client_id 并在 client_id 和 max_date 上加入,它可能会用作内部连接。
    • @AlexBello 是的 SELECT * FROM client_address a INNER JOIN (SELECT b.Client_id, max(b.date_updated) max_updated FROM client_address b group by b.Client_id) c ON a.Client_id = c.Client_id AND a.date_updated = c.date_updated 应该也可以。
    • 不确定我是否理解它为什么不起作用,但我会在我一直使用的类似查询上尝试 Conrads 解决方案,看看我是否得到相同的结果或可能更好的性能。谢谢!
    • @CoSpringsGuy OP 想要的是最后一次更新为每个 客户端的client_address。您的查询返回最后更新的客户地址,通常是一条记录。考虑two results here 注意:您需要点击“运行查询”才能看到文本输出
    • 感谢您帮助我了解康拉德。很抱歉支持您的帖子 Alex
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多