0

我试图为每个 USERID 拉 2 行,第一行是最旧的日期(RSLVD_DTTM),第二行是最新的(RSLVD_DTTM)

这是我目前拥有的

USERID  VIRTUAL_PROFILE            LINE_STABILITY numb1  numb2     RSLVD_DTTM

USER1  STGR_al2_d7296-1184_u1088-256    STABLE  "7,296" "20,074"    12/06/2012  
USER1  STGR_al1_d12288-5056_u1088-256   STABLE  "12,284""21,700"    08/01/2013  
USER1  STGR_al1_d7296-1184_u1088-256    STABLE  "7,292" "21,479"    06/11/2012  
USER1  STGR_al1_d7296-1184_u1088-256    STABLE  "7,292" "20,365"    03/04/2012

这是我希望输出的示例。

USERID  VIRTUAL_PROFILE LINE_STABILITY_RATING    numb1    numb2     RSLVD_DTTM
USER1   STGR_al1_d7296-1184_u1088-256   STABLE  "7,292" "20,365"    03/04/2012  
USER1   STGR_al1_d12288-5056_u1088-256  STABLE  "12,284""21,700     08/01/2013

这是我的查询

select 
  USERID,
  VIRTUAL_PROFILE, 
  LINE_STABILITY_RATING,
  numb1,
  numb2,
  RSLVD_DTTM
from 
  symmktg.V_NDW_ACTUAL_SPEEDS, symmktg.VREMEDY_SYM_TICKET
where 
   USERID IS IN ('USER1')
   and cast(RSLVD_DTTM as date) = '2013/03/23' 

任何帮助,将不胜感激。

4

4 回答 4

1

row_number()您可以为此使用窗口函数:

select USERID,VIRTUAL_PROFILE, LINE_STABILITY_RATING,numb1,numb2,RSLVD_DTTM
from (select USERID,VIRTUAL_PROFILE, LINE_STABILITY_RATING,numb1,numb2,RSLVD_DTTM,
             row_number() over (partition by userId order by rslvd_dttm asc) as seqnuma,
             row_number() over (partition by userId order by rslvd_dttm desc) as seqnumd
      from symmktg.V_NDW_ACTUAL_SPEEDS, symmktg.VREMEDY_SYM_TICKET
      where USERID IS IN ('USER1') and cast(RSLVD_DTTM as date) = '2013/03/23' 
     ) t
where seqnuma = 1 or seqnumd = 1

大多数数据库都支持此功能。

顺便说一句,我不明白你的问题。连接条件应该使用现代连接语法而不是,.

于 2013-03-27T15:51:22.343 回答
1

以下查询将仅获取给定用户的最旧和最新记录:

select userid,
       virtual_profile,
       line_stability_rating,
       numb1,
       numb2,
       rslvd_dttm
from 
   symmktg.v_ndw_actual_speeds, 
   symmktg.vremedy_sym_ticket

where 
   userid in ('user1')
   and (rslvd_dttm = (select min(rslvd_dttm) 
                      from symmktg.v_ndw_actual_speeds, symmktg.vremedy_sym_ticket
                      where userid in ('user1'))
    or  (rslvd_dttm = (select max(rslvd_dttm) 
                       from symmktg.v_ndw_actual_speeds, symmktg.vremedy_sym_ticket)
                       where userid in ('user1'))
于 2013-03-27T15:52:23.730 回答
0

您的查询没有告诉我们您的表定义,即哪一列来自哪个表。

看起来您正在使用交叉连接,这意味着您获得的结果集在每个表的字段之间没有明确的关系。这可能是故意的,但我对此表示怀疑。我希望您的两个表之间存在某种主键/外键关系,这样对于一个表中的每一行,另一个表中有许多相应的行。目前,对于一个表中的每一行,您将返回另一个表中的每一行。

所以我认为这是您所追求的一般模式,使用更现代(且明确)的 Ansi92 语法:

  Select 
    t.your-return-values, 
    ..., 
    o.your-other-return-values, 
    ...

  From
    Sourcetable t

    Inner join yourothertable o 
    on o.somekey = t.somekey

    Inner join
    (
       Select UserId, min(rslvd_dttm) as mindttm, max(rsvld_dttm) as maxdttm
       From sourcetable
       Group by userid

    ) q
    On t.userid = q.userid 
    and (t.rslvd_dttm = q.mindttm or t.rslvd_dttm = q.maxdttm)

但是,您需要确定一个表中的哪个字段与另一个表中的哪个字段相关,我要为第一次连接指定您的键。

此外,连接当前是 INNER,这意味着它只会返回来自第一个表的结果,如果第二个表中至少存在一个对应的结果。

您可能希望将其更改为 LEFT,这意味着返回包含第一个表中的值的行,即使找不到来自第二个表的匹配行(在这种情况下,这些列对于该行返回 null)。

如果您在使用的 Ansi89 语法中需要它,请告诉我,我会看看我能做什么!

于 2013-03-27T15:55:11.530 回答
0

正如其他一些人已经告诉您的那样,两个表之间没有真正的连接条件。

添加到 Gordon Linoff 的解决方案:

  1. 您可以在 Teradata 中使用 QUALIFY 而不是派生表
  2. 具有不同 ORDER BY 的两个 ROW_NUMBER 将导致两步计算,当您用 MAX/MIN 重写它时,它只是一个步骤

这将导致

select 
  USERID,
  VIRTUAL_PROFILE, 
  LINE_STABILITY_RATING,
  numb1,
  numb2,
  RSLVD_DTTM
from 
  symmktg.V_NDW_ACTUAL_SPEEDS, symmktg.VREMEDY_SYM_TICKET
where 
   USERID IS IN ('USER1')
   and cast(RSLVD_DTTM as date) = '2013/03/23'
qualify 
   min() over (partition by userId) = RSLVD_DTTM
or max() over (partition by userId) = RSLVD_DTTM
于 2013-11-24T16:52:28.507 回答