Oracle 11g SQL 查询 - 指定要从 Select 语句中排除的重复项
Oracle 11g SQL Query - Specify which duplicates to Exclude from Select Statement
我有一个关于用我的 Oracle SQL 查询排除重复值的问题。在这种情况下,使用 select distinct 不起作用。我只想 select 每个事件#一行,移动 = 是的那一行。
当前查询的实际结果:
State Town Event# Date Username Mobile?
MA WATERTOWN 1 24-Jun-21 jappleseed N
MA WATERTOWN 1 24-Jun-21 mobile Y
MA WATERTOWN 2 24-Jun-21 jsmith N
MA WATERTOWN 3 24-Jun-21 mobile Y
MA WATERTOWN 4 24-Jun-21 mobile Y
期望的结果:
State Town Event# Date Username Mobile?
MA WATERTOWN 1 24-Jun-21 mobile Y
MA WATERTOWN 2 24-Jun-21 jsmith N
MA WATERTOWN 3 24-Jun-21 mobile Y
MA WATERTOWN 4 24-Jun-21 mobile Y
在这个理想的结果中,事件 # 1 的其中一行尚未 selected - 保留的行是 Mobile = Y 的位置。是否可以排除重复项,但控制哪一行是保留,哪个不是? (在这种情况下,我想保留结果中 Mobile = Y 的行)。解决方案不能特定于这个 Event#,因为这只是来自 table 的一小部分 excerpt/example 数据,其中有数千行,并且有数百种重复发生的情况。从 table 中删除记录也不是一个选项。
当前 SQL 查询:
SELECT DISTINCT
STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
FROM EVENT_DETAILS
WHERE DATE >= sysdate -365
AND TOWN = 'WATERTOWN'
ORDER BY
EVENT# DESC
任何建议将不胜感激!
我想你可以在这里使用 window 函数 -
SELECT DISTINCT STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
FROM (SELECT STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
,ROW_NUMBER() OVER(PARTITION BY EVENT# ORDER BY MOBILE DESC) RN
FROM EVENT_DETAILS)
WHERE DATE >= sysdate -365
AND TOWN = 'WATERTOWN'
AND RN = 1
ORDER BY EVENT# DESC;
您可以使用row_number()
,但您必须小心筛选。我会推荐:
select *
from (select ed.* ,
row_number() over (partition by town, event# order by mobile desc) as seqnum
from event_details ed
where date >= sysdate -365 AND
town = 'WATERTOWN'
) ed
where seqnum = 1
order by EVENT# desc;
请注意,您也不需要在外部查询中使用 select distinct
。
您也可以在不使用 row_number 的情况下使用以下查询来获得所需的结果。
WITH CTE1 AS
(SELECT * FROM TABLE1 WHERE "Mobile" = 'Y')
SELECT * FROM TABLE1 A WHERE NOT EXISTS(SELECT 1 FROM CTE1 B
WHERE A."Event" = B."Event")
UNION
SELECT * FROM CTE1
我有一个关于用我的 Oracle SQL 查询排除重复值的问题。在这种情况下,使用 select distinct 不起作用。我只想 select 每个事件#一行,移动 = 是的那一行。
当前查询的实际结果:
State Town Event# Date Username Mobile?
MA WATERTOWN 1 24-Jun-21 jappleseed N
MA WATERTOWN 1 24-Jun-21 mobile Y
MA WATERTOWN 2 24-Jun-21 jsmith N
MA WATERTOWN 3 24-Jun-21 mobile Y
MA WATERTOWN 4 24-Jun-21 mobile Y
期望的结果:
State Town Event# Date Username Mobile?
MA WATERTOWN 1 24-Jun-21 mobile Y
MA WATERTOWN 2 24-Jun-21 jsmith N
MA WATERTOWN 3 24-Jun-21 mobile Y
MA WATERTOWN 4 24-Jun-21 mobile Y
在这个理想的结果中,事件 # 1 的其中一行尚未 selected - 保留的行是 Mobile = Y 的位置。是否可以排除重复项,但控制哪一行是保留,哪个不是? (在这种情况下,我想保留结果中 Mobile = Y 的行)。解决方案不能特定于这个 Event#,因为这只是来自 table 的一小部分 excerpt/example 数据,其中有数千行,并且有数百种重复发生的情况。从 table 中删除记录也不是一个选项。
当前 SQL 查询:
SELECT DISTINCT
STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
FROM EVENT_DETAILS
WHERE DATE >= sysdate -365
AND TOWN = 'WATERTOWN'
ORDER BY
EVENT# DESC
任何建议将不胜感激!
我想你可以在这里使用 window 函数 -
SELECT DISTINCT STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
FROM (SELECT STATE
,TOWN
,EVENT#
,DATE
,USERNAME
,MOBILE
,ROW_NUMBER() OVER(PARTITION BY EVENT# ORDER BY MOBILE DESC) RN
FROM EVENT_DETAILS)
WHERE DATE >= sysdate -365
AND TOWN = 'WATERTOWN'
AND RN = 1
ORDER BY EVENT# DESC;
您可以使用row_number()
,但您必须小心筛选。我会推荐:
select *
from (select ed.* ,
row_number() over (partition by town, event# order by mobile desc) as seqnum
from event_details ed
where date >= sysdate -365 AND
town = 'WATERTOWN'
) ed
where seqnum = 1
order by EVENT# desc;
请注意,您也不需要在外部查询中使用 select distinct
。
您也可以在不使用 row_number 的情况下使用以下查询来获得所需的结果。
WITH CTE1 AS
(SELECT * FROM TABLE1 WHERE "Mobile" = 'Y')
SELECT * FROM TABLE1 A WHERE NOT EXISTS(SELECT 1 FROM CTE1 B
WHERE A."Event" = B."Event")
UNION
SELECT * FROM CTE1