sql—如何通过oracle中其他列上的不同角色获取不同列的值

sc4hvdpw  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(288)

我有一个表,每个clientid包含几行。每一行来自不同的公司和不同的验证日期。
例如(你也可以在这个链接上找到它):

ID    |COMPANY|GENDER|AGE|IS_SMOKER|VALIDATION_DATE |ZIP    |ZIP_VALIDATION_DATE
--------------------------------------------------------------------------------
1111  | 1     | m    |44 |  1      |    02-MAR-03   |12345  |02-MAR-03
1111  | 3     | m    |43 |  NULL   |    03-FEB-10   |11111  |03-FEB-00
2222  | 1     | f    |20 |  0      |    04-APR-00   |22344  |04-APR-00
2222  | 3     | f    |50 |  0      |    05-MAY-82   |22344  |05-MAY-82
3333  | 1     | f    |34 |  0      |    05-MAY-01   |33333  |01-MAY-00
3333  | 7     | f    |34 |  1      |    05-MAY-00   |22222  |05-MAY-00
4444  | 3     | m    |95 |  NULL   |    06-JUN-03   |12345  |02-MAR-03

我想为每个id获取一行,但每个数据具有不同的角色:
邮政编码,但邮政编码的最大日期是
smoker-如果是任何公司的smoker(1),则获取1如果有0,则获取1如果为null,则获取0获取null
其他数据-按最长验证日期
我想要的结果是:

ID    |GENDER|AGE|IS_SMOKER|ZIP 
---------------------------------
1111  | m    |43 |  1      |12345
2222  | f    |20 |  0      |22344
3333  | f    |34 |  1      |22222
4444  | m    |95 |  NULL   |12345

注:
当zip\u validation\u date仅对一列有效时,validation\u date适用于多个列。
我有几个不同角色的专栏(比如吸烟者)和另一个特定的验证日期。我没有将它添加到示例中,但我认为它将是相同的实现。
我试图找到最有效的方法来做到这一点,但我没有限制使用over partition、with、sub\u query或其他方法。

q9rjltbz

q9rjltbz1#

如果我遵循正确的逻辑,您可以使用oracle的 keep 聚合功能:

select id, 
       max(gender) keep (dense_rank first order by validation_date desc) as gender,
       max(is_smoker),
       max(age) keep (dense_rank first order by validation_date desc) as age,
       max(zip) keep (dense_rank first order by ZIP_VALIDATION_DATE desc) as zip
from my_table t
group by id
order by id;

这是一把小提琴。

qv7cva1a

qv7cva1a2#

请使用下面的查询,

select id, gender, age, is_smoker, zip from
(select id, gender, age, is_smoker, zip, 
row_number() over(partition by id order by validation_date desc) as rnk
from table_name) qry where rnk = 1;

下面是演示,
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c834e8e07d58f714955eccb9704fc34b

相关问题