【问题标题】:SQL server query UNION ALL [duplicate]SQL 服务器查询 UNION ALL [重复]
【发布时间】:2016-03-17 18:10:11
【问题描述】:

我有一个 UNION ALL 查询,但得到的结果不正确。我应该得到大约 110000 条记录。请查看查询...

select 
    Pop, planID, PopFull, ApptDate, intake1,FollowUP2,FollowupCode, rn, '5133'
from 
    (Select *, row_number() over (partition by planID order BY AddedDate asc) as rn from Vinfo) t
where 
    rn = 1 and ApptDate >='12/1/2014' and ApptDate <='12/31/2015'

Union All

select  
    Pop, planID, PopFull, ApptDate, intake1, FollowUP2, FollowupCode, rn, '5133' 
from 
    (Select *,row_number() over (partition by PlanID order BY AddedDate  DESC) as rn from Vinfo) t
where 
    rn = 1 and ApptDate >='12/1/2014' and ApptDate <='12/31/2015'

所以我要做的是选择所有信息,并且在第一个 SELECT 语句中,当 ADDEDDATE 是最低(最早)时,我试图获取 INTAKE 的值。

我正在执行 UNION all,因为在第二个 SELECT 语句中,当 ADDEDDATE 是 最旧(最近的) 时,我试图获取 FOLLOWup 的值.

INTAKE 和 FOLLOWUP 的值可能不同,但不一定如此。我正在尝试追踪差异。

但是,当我运行此查询时,我得到了双倍的记录。有没有办法让我运行这个查询,以便我可以获得正确数量的记录 (1100) 并获得 INTAKE 的值,如果 FOLLOWUP 的值发生变化,我会在同一行看到它?

而不是看到双重的一切。基本上它现在的运行方式是如果 PLANID 是 1023 并且最早日期的摄入量是 B,那么它也会向我显示 FollowUP 的 B。此外,如果 LATEST 日期的 FollowUP 是 C,那么它会在下面的行中显示 C 表示 Intake 和 FollowUP。

编辑:

select Pop,planID,PopFull,ApptDate, intake1,FollowUP2,FollowupCode, '5133'
from (select *,
row_number() over (partition by planID order BY AddedDate asc) as rn_first,
row_number() over (partition by PlanID order BY AddedDate  DESC) as rn_last
from VInfo
) t
where t.rn_first = 1 or rn_last = 1
and ApptDate >='12/1/2014' and ApptDate <='12/31/2015'

运行这个但没有给出正确的结果

【问题讨论】:

  • 如果您对记录数的投诉,问题不在UNION ALL。 Union all 只是返回 2+ 个放在一起的结果集。如果您的第一个查询返回 n 条记录和第二条 m 条记录,请查看您的 n 和 m 是否正确。 UNION [w/o ALL] 不会返回重复项
  • 如果我(单独)运行第一个查询,它会给我 1100 条记录,如果我运行第二个查询,我会得到 1100。但是当我使用 Union ALL 运行它们时,它会给我 2400。当我运行时如果没有“ALL”,我会得到 2150 条记录,因为它会消除重复项,但其中很多是不同的。
  • 您关心实际的行号,还是使用该功能只是为了找到最早/最晚添加日期的摄入量/跟进?
  • 我想拥有 1100 条记录,其中 VALUE 用于 INTAKE,Value 用于 FOLLOWUP。但是如果不一样,我想在同一行中看到两个不同的值。假设最早日期的 INTAKE 值为 B,而最新的 FOLLOWUP 值为 - 值为 C - 我希望在同一行中看到这些值。 B 表示摄入量,C 表示随访。
  • 用括号显示每个 PLAN ID 的 2 个实例。因此,因为最早日期的摄入量和最晚日期的跟进值不同 - 我为每个计划 ID 得到两行

标签: sql sql-server union union-all


【解决方案1】:

对于那些只有一个 Pop, planID, PopFull, ApptDate, intake1, FollowUP2, FollowupCode 组合实例的行,您显然会得到重复 - 即 ASC 和 DESC 都返回一行,并且 rn=1 用于 ASC 和 DESC 排序。

UNION ALL 确实允许顶部和底部行集的重复。 你可以试试UNION

另外,如前所述,您可以在单选中同时计算 ROW_NUMBERS 个:

select *
from
(
  select v.*,
    row_number() over (partition by PlanID order BY AddedDate asc) as rn_first,
    row_number() over (partition by PlanID order BY AddedDate  DESC) as rn_last
  from Vinfo v
) t
where t.rn_first = 1 or rn_last = 1

【讨论】:

  • 这是我的错误。在这两种情况下都是planID
  • 没有 RecPlanID 的更新
  • 见编辑@ivan starostin
  • 对不起,这是一个错字 - 我更新了我的答案。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多