我有一个客户数据库,需要在其中按年龄筛选每个客户。在某些情况下,客户注册了多个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
值;docpaxdob
列是DATE
,不是吗?如果没有,那就是你应该解决的另一件事——不要将日期存储为字符串。如果是VARCHAR2
,那么to_date
是不够的——您还应该提供格式模型 - 在
case
表达式中包含I
doccd
值没有意义,因为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;