Oracle11g 使用Oracle Partition和Over By子句检索节号

Oracle11g 使用Oracle Partition和Over By子句检索节号,oracle11g,Oracle11g,我的表格包括4列(患者、样本、分析和成分)。我试图编写一个查询,查看每个记录的患者、分析和成分组合,并指定一个“科号”。 应为每位患者重新开始编号 请参见下面的预期输出。患者1010有3个样本,但都有相同的分析成分。因此,它们都具有相同的第(1)节。 现在,患者2020的计数重新开始。该患者有2个样本,但两个样本的分析成分组合不同。因此,它们被放置在单独的第1节和第2节中 Patient Sample Analysis Component Section Nu

我的表格包括4列(患者、样本、分析和成分)。我试图编写一个查询,查看每个记录的患者、分析和成分组合,并指定一个“科号”。 应为每位患者重新开始编号

请参见下面的预期输出。患者1010有3个样本,但都有相同的分析成分。因此,它们都具有相同的第(1)节。 现在,患者2020的计数重新开始。该患者有2个样本,但两个样本的分析成分组合不同。因此,它们被放置在单独的第1节和第2节中

Patient   Sample       Analysis     Component       Section Number       
_______   ______       ________     _________       ______________
1010    720000140249    CALC        Calcium               1
1010    720000140288    CALC        Calcium               1
1010    720000140288    CALC        Calcium               1
2020    720000190504    ALB         Albumin               1
2020    720000160504    ALB         Albumin Pct           2
3030    720000134568    CALC        Calcium               1
3030    720000123404    ALB         Albumin               2
3030    720000160765    ALB         Albumin Pct           3
我已经编写了以下查询,但它所做的只是将具有相同组件的示例分组到一个部分中。它根本不考虑病人或分析。 非常感谢你的帮助(一如既往!)


我猜你想

dense_rank() over (partition by patient
                       order by analysis desc, component) myRowCount
打成平局后发生了什么?如果患者1010接受ALB分析?那会有一个
MyRowCount
为2的值吗?还是4
rank
将返回4
dense_rank
将返回2


您如何确定一个特殊患者的行顺序?对于
分析
组件
似乎是按相反的字母顺序进行的,但这似乎是一个非常不寻常的顺序。

谢谢您的回复。谢谢您的回复。如果行数相等,可以跳过一个数字。此外,我没有任何具体的订购要求。抱歉,我不确定我的查询的哪一部分指示按字母顺序反向排序进行分析。如果您能指出这一点,我将非常感谢。@ERS-对于3030号患者,您的CALC行位于ALB行之前。白蛋白Pct排在白蛋白排之后。这就是我推断出你想要的订单的地方。我明白了-很抱歉混淆了。然而,我不能得到所需的输出,无论是排名或密集_排名。这对于只有一个分析=多个样本的成分组合的患者记录非常有效。在有不同组合的情况下,它不会给我期望的输出。我看到一些记录,其中相同的节号(或等级)应用于具有不同分析组件组合的记录。你还有什么其他建议吗?@ERS\u rank()应该很管用。也许你用错地方了。我将给出另一个答案来显示sql,但这个答案是正确的。
select x.patient, x.sample_number, x.analysis, x.component,
       dense_rank() over(partition by x.patient order by x.analysis, x.component)
from X_PREV_PAT_RESULTS x 
where exists (select 1 from X_PREV_PAT_RESULTS x1 where x1.COMPONENT = x.COMPONENT);
select x.patient, x.sample_number, x.analysis, x.component,
       dense_rank() over(partition by x.patient order by x.analysis, x.component)
from X_PREV_PAT_RESULTS x 
where exists (select 1 from X_PREV_PAT_RESULTS x1 where x1.COMPONENT = x.COMPONENT);