以下报告生成id,name,primary(用户是否为主要用户(Y或N)以及用户加入的日期。我不希望报告中有任何重复的ID,我想要基于条件来删除主列上的欺骗。如果名称是主要的,我想保留行。如果它不是主要的,我只想在有主要时删除它。
ID Name Primary Date
1, Jerry, Y, 2/10/12
1, Jack, N, 2/10/12
1, Jerry, N, 2/10/12
2, Nancy, Y, 1/18/17
2, Chris, N, 3/4/15
3, Vicky, N, 10/2/16
3, Mary, Y, 2/2/10
4, Jeff, N, 1/1/11
4, John, N, 2/2/12
期望的输出
ID Name Primary Date
1, Jerry, Y, 2/10/12
2, Nancy, Y, 1/18/17
3, Mary, Y, 2/2/10
4, Jeff, N, 2/2/12
基本上我想为每个id显示一行,但如果有的话,它必须显示主行。如果没有,那么它必须显示非主要。如果有多个主要的只显示一个,那么无关紧要,如果有多个非主要(当没有任何主要时)只显示一个而且无关紧要。
如果条件是基于我可以使用最小值或最大值的日期,但这个是不同的。
答案 0 :(得分:0)
您可以创建按primary DESC
排序的额外列排名(Y
将更高)和日期。如果您有两个Y
或N
,则排名1将是具有较新日期的排名。然后,您可以添加过滤器进行查询,以便仅使用rank=1
过滤列。
额外列的表达式定义:
rank( [Query2].[PRIMARY] DESC,[Query2].[DATE_ID] for [Query2].[ID])
答案 1 :(得分:0)
使用以下表达式添加名为行计数的数据项:
running-count(1 for [ID],[Primary])
将数据项的聚合属性设置为计算。我们将此数据项用作决胜局。
现在添加此过滤器:
[Primary] = maximum([Primary] for [ID])
and
[Row Count] = minimum([Row Count] for [ID],[Primary])
当有Y行时,这将只显示一个Y行,当没有Y行时,它将回退到单个N行。当第一个条件导致多行时,第二个条件选择第一个条件。由于您表示如果有多个行,您并不关心选择哪一行,我们可以通过更改第二部分中的 minimum()函数轻松选择最后一行。过滤器 maximum()。
注意:应用于单个字符时,聚合函数 maximum()使用字符的ASCII数字表示形式进行比较。 N的ASCII值为78,而Y的值为89.因此,当Y和N值都存在时,Y始终是最大值。当然,当只存在N个值时,N变为最大值。