Oracle Analytics-类似的价值观



我有一个客户数据库,需要在其中按年龄筛选每个客户。在某些情况下,客户注册了多个dob。

到目前为止,我有这个疑问。作为一个例子,我只使用一个定位器

SELECT DISTINCT
Doc.PNRLOCATORID,
Doc.RESPAXID,
Doc.FLTNBR,
TO_DATE(Doc.DOCPAXDOB) as Data,
Doc.DOCPAXGENDER as Genero,
CONCAT(FLTNBR,(CONCAT(PNRLOCATORID,TO_CHAR(CONCAT(RESPAXID,(CASE WHEN (DOCCD IN ('I','P','F','C')) THEN 1 ELSE 0 END)))))) AS VAL
FROM G2S_TDB_P.ACSPAXDOCX Doc
WHERE Doc.DOCCD NOT IN ('I') AND DOC.PNRLOCATORID = 'LIHAVP'
ORDER BY VAL

结果

PNRLOCATORID RESPAXID   FLTNBR  DATA                GENERO  VAL
LIHAVP       1          7734    12/10/1988 00:00    F       7734LIHAVP11
LIHAVP       2          7734    16/04/1990 00:00    M       7734LIHAVP21
LIHAVP       2          7734    03/03/2000 00:00    M       7734LIHAVP21
LIHAVP       1          7735    12/10/1988 00:00    F       7735LIHAVP11
LIHAVP       2          7735    16/04/1990 00:00    M       7735LIHAVP21
LIHAVP       2          7735    03/03/2000 00:00    M       7735LIHAVP21

因此,正如您所看到的,客户#2有两个dob,我如何修改查询并只选择所有客户中的旧数据?

我为每个客户创建了一个唯一的密钥(Val(,我认为只要为每个客户选择一个值"Val",我就可以消除这种双重性。只是不知道怎么做。

如果有更简单的方法,请告诉我。我在Oracle Analytics上执行所有这些操作,因此我无法创建临时表。

正在尝试此查询。。。

WITH temp
AS (
SELECT DISTINCT d.pnrlocatorid,
d.respaxid,
d.fltnbr,
d.docpaxdob                AS data,
d.docpaxgender             AS genero,
d.fltnbr
|| d.pnrlocatorid
|| To_char(d.respaxid
|| CASE
WHEN( d.doccd IN( 'P', 'F', 'C' ) ) THEN
1
ELSE 0
END)         val,
Row_number()
over(
PARTITION BY d.respaxid
ORDER BY d.docpaxdob ) rn
FROM   g2s_tdb_p.acspaxdocx d
WHERE  d.doccd NOT IN ( 'I' )
AND d.pnrlocatorid = 'LIHAVP')
SELECT *
FROM   temp
WHERE  rn = 1
ORDER  BY val

系统给我这个信息

O driver Odbc retornou um erro (SQLExecDirectW).
Estado: HY000. Código: 43119. [nQSError: 43119] Falha na Consulta:
(HY000)
Estado: HY000. Código: 17001. [nQSError: 17001] Código de erro Oracle: 32034, mensagem: ORA-32034: unsupported use of WITH clause
at OCI call OCIStmtExecute.
(HY000)
Estado: HY000. Código: 17010. [nQSError: 17010] Falha de preparação da instrução SQL. (HY000)
Instrução SQL Executada: SET VARIABLE DISABLE_CACHE_SEED=1,DISABLE_XSA_CACHE_SEED=1,ENABLE_DIMENSIONALITY=1;SELECT
0 s_0,

在修复数据之前(请参阅mathguy的评论(,您可以将当前查询用作CTE,添加row_number分析函数,该函数按每个客户划分数据,按日期值排序,以便最旧的先到;然后,在主查询中,只返回排名最高的行。

修改您的查询:

  • 使用双管||串联运算符,而不是嵌套的concat函数;使代码更易于阅读
  • 不要使用已经是日期的to_date值;docpaxdobDATE,不是吗?如果没有,那就是你应该解决的另一件事——不要将日期存储为字符串。如果是VARCHAR2,那么to_date是不够的——您还应该提供格式模型
  • case表达式中包含Idoccd值没有意义,因为where子句将I从表中排除

最后,这是一个您可能会尝试使用的查询:

WITH temp
AS (
-- this is your current query, modified a little bit
SELECT DISTINCT d.pnrlocatorid,
d.respaxid,
d.fltnbr,
d.docpaxdob                AS data,
d.docpaxgender             AS genero,
d.fltnbr
|| d.pnrlocatorid
|| To_char(d.respaxid
|| CASE
WHEN( d.doccd IN( 'P', 'F', 'C' ) ) THEN
1
ELSE 0
END)         val,
Row_number()
over(
PARTITION BY d.respaxid
ORDER BY d.docpaxdob ) rn
FROM   g2s_tdb_p.acspaxdocx d
WHERE  d.doccd NOT IN ( 'I' )
AND d.pnrlocatorid = 'LIHAVP')
SELECT *
FROM   temp
WHERE  rn = 1
ORDER  BY val;  

相关内容

  • 没有找到相关文章

最新更新