查询生成器 - 唯一记录<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好 ,
经过一番个人努力来解决我的问题后,我决定将其作为问题发布给用户和 JMP 社区。
有一个数据库,从中提取 p1、p2、资产和时间。 数据库是一个累积数据库,这意味着参数 p1 和 p2 被加载为代表每个的最后状态资产在特定的时间. 换句话说,p1 和 p2 的先前旧实例是无效的,并且给定的需要 p1 和 p2 的最新版本资产据最新报道时间.
因此,我需要的是降序通过时间然后强制结果在资产等级。
关于我需要如何在查询生成器中指导它的任何想法?
我更喜欢通过不使用自定义 SQL 来获得解决方案.... 我实际上在 Custom SQL 中有一个解决方案,但我想学习如何在查询构建器中执行此操作,因为我将添加一些在 Custom SQL 中很难做到的部分
感谢帮助。
阿尔图拜拉姆
回复:查询生成器 - 唯一记录这是一个旧帖子,但这里是:
@altug_bayram写道:
我忘了添加...
我最初无法使您的查询正常工作的原因是我没有以正确的方式引用数据库。 一旦我们这样做了,它就奏效了
正确的方式是什么? 我还收到一条错误消息,提示“错误:关系“databases_enzyme_db”不存在;准备参数时出错 [SQLSTATE=42P01]”,我不确定如何解决它
回复:查询生成器 - 唯一记录我的荣幸。这个线程确实推动了我对子查询的理解。我学到了很多。
小心,
埃里克
回复:查询生成器 - 唯一记录埃里克,
我现在理解得更好并且同意你的看法。 再次感谢您为此问题所做的努力。
您的帮助非常宝贵。
回复:查询生成器 - 唯一记录仅使用 Time 运行原始版本并在 X 上使用 MAX 聚合可以返回正确的行,但您将无法找出这些行的 p1 和 p2 的值。如果我按照你说的在查询中留下 p1 和 p2,我会得到所有具有重复最大次数的行,因为 p1 和 p2 成为查询的 GROUP BY:

现在,如果我从查询中取出 p1 和 p2,查询将返回正确的行:

但重点是找到这些行的 p1 和 p2 的值,它们已经消失了。所以我认为双重子查询方法是唯一可以回答您提出的问题的方法。
埃里克
回复:查询生成器 - 唯一记录埃里克,
它就像一个魅力...
我想知道......它是否也可以通过运行自定义 epxression 的第一个原始版本(只有时间)并在“包含的列”字段中选择 X 聚合作为“最大值”来工作......?
非常感谢 ....
回复:查询生成器 - 唯一记录DISTINCT 不会帮助 OP,因为这里确实没有任何不同的行。
我找到了可以解决第二种情况的查询。我在底部添加了 6 行,用于复制每个资产的最大次数,并添加了一个 X 变量。这是表格:

这是有效的查询(它需要一个子查询和一个子查询中的一个子查询):

自定义表达式为:
t1.Time = (SELECT MAX(tInner.Time) FROM parts tInner WHERE t1.Asset = tInner.Asset)
和
t1.X = (SELECT MAX(tInner.X) FROM parts tInner WHERE t1.Asset = tInner.Asset 和
tInner.Time = (SELECT MAX(tInner2.Time) FROM parts tInner2 WHERE tInner.Asset = tInner2.Asset))
我将所有的 SQL 关键字都大写以便于阅读。我尝试了一些更简单的查询,但它们没有用。
卫生部,
埃里克
回复:查询生成器 - 唯一记录如果它是重复条目,也许使用 DISTINCT 关键字会有所帮助。
回复:查询生成器 - 唯一记录我忘了添加...
我最初无法使您的查询正常工作的原因是我没有以正确的方式引用数据库。 一旦我们这样做了,它就奏效了
回复:查询生成器 - 唯一记录埃里克,
多谢 ....
抱歉,我花了一些时间与 GE 的另一位查询专家一起解决这个问题。
您的解决方案(第一个)绝对有效!!! 我还没有尝试过第二个。
我还有一个问题——
事实证明,填充数据库的人在最后一个时间顺序上为一些资产插入了重复条目。 因此,为了解决这个问题,我还有一个名为 say X 的专栏。 我会手动选择两个最大的 X。 我不想从 Max(Time) 转换为 Max(X),因为 X 本身可能不那么可靠,但会成为重复时间条目的选择因素。
我们尝试将您的原始自定义表达式转换为包括第二个 MAX(在 X 上)...但这没有用...
所以 .. 尝试提取时间为 MAX 的每个资产,如果有多个条目选择带有 Max(X) 的条目
有什么建议
回复:查询生成器 - 唯一记录我最初的例子是针对 SQL Server 的,它更宽容一些。对于 Oracle,我必须将子查询中的表名格式化为 schema.table,而且我必须引用我的混合大小写名称:
t1."Time" = (从中选择 MAX(t2."Time") SQB测试。 “零件” t2 其中 t2.“资产” = t1.“资产”)
尝试改变我的表在你第一次尝试<架构>.my_table看看是否有帮助。
埃里克
回复:查询生成器 - 唯一记录嘿,阿尔图格,
你使用什么数据库?
您是否愿意分享自定义 SQL 查询中的 SQL,从而为您提供所需的结果?
谢谢,
埃里克
回复:查询生成器 - 唯一记录你好埃里克,
首先感谢您的帮助....
你的理解是正确的。 我只是想为时间最大(或最近)的每个资产拉一行。
我应用了你的公式。 但是,它给了我一个错误。
我首先将它用作真实表名,然后将其用作“t1”
t1.calendar_month = (select MAX(calendar_month) from my_table t2 where t1.engine_serial_num = t2.engine_serial_num)
t1.calendar_month = (select MAX(calendar_month) from t1 t2 where t1.engine_serial_num = t2.engine_serial_num)
错误:关系“my_table”不存在。
执行查询时出错 [SQLSTATE: 42P01]
回复:查询生成器 - 唯一记录嘿,阿尔图格,
这是一个我认为类似于您所描述的表(但假设它在数据库而不是 JMP 中):

我的理解是,您想为 A1、A2、A3 和 A4 检索时间最长的一行。那是对的吗?
如果不执行使用 MAX 函数的子查询,我认为这是不可能的,您可以使用自定义表达式过滤器来执行此操作。这是我最终得到的查询:

如果太小而无法阅读,则自定义表达式为:
t1.Time =(从 t2 部分中选择 MAX(时间),其中 t1.Asset = t2.Asset)
因此,您从主查询 (t1.Asset) 传入资产值,并选择具有该资产最大时间值的行。
让我知道是否有帮助。
埃里克
回复:查询生成器 - 唯一记录账单
感谢您的快速回复。
但是,除非我在这里遗漏了一个关键的东西,否则这并不能解决我的问题。
1) 任何资产的最后有效点通常不在同一时间点,它们是完全不同的。 他们可以有多年的差异。
2)如果可能的话,我不会寻找快速的解决方案。 我需要它完全自动化。
3) 我真的不确定使用 >= 的“过滤依据”如何使它独一无二。 我认为你宁愿用“=”过滤
因此,我需要一种方法来获取任何资产的最新时间顺序条目,而无需指定时间过滤器(因为最新数据可以在任何时间)。
谢谢。
回复:查询生成器 - 唯一记录嗨,阿尔图格,
请参阅下图以获取时间的降序。
右键单击可用列中的时间变量,然后选择“排序依据”,右下方会弹出一个新对话框。从那里您可以选择下降箭头以获得所需的时间顺序。
然后,您可以使用带有提示的过滤器来选择唯一的资产级别。
