0

USERID ごとに 2 行をプルしようとしています。最初の行は最も古い日付 (RSLVD_DTTM) で、2 番目の行は最新 (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

HEREは、私が出力したいものの例です。

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

HEREは私のクエリです

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

あなたのクエリは、テーブルの定義、つまり、どの列がどのテーブルから来ているかを教えてくれません。

また、クロス結合を使用しているようにも見えます。つまり、各テーブルのフィールド間に明確な関係がない結果セットを取得しています。これは意図的なものかもしれませんが、私はそれを疑っています。1 つのテーブルの各行に対して、他のテーブルの対応する行が多数存在するように、2 つのテーブル間にある種の主キー/外部キーの関係が期待されます。現在、1 つのテーブルの各行に対して、他のテーブルのすべての行を返しています。

したがって、これは、より現代的な(そして明示的に明確な)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 です。つまり、少なくとも 1 つの対応する結果が 2 番目のテーブルに存在する場合、最初のテーブルからの結果のみが返されます。

これを LEFT に変更することもできます。これは、2 番目のテーブルから一致する行が見つからなくても、最初のテーブルの値を含む行が返されることを意味します (この場合、それらの列はその行に対して null が返されます)。

使用していた Ansi89 構文でこれが必要な場合は、お知らせください。できることを確認します。

于 2013-03-27T15:55:11.530 に答える
0

他の人がすでに言ったように、両方のテーブル間に実際の結合条件はありません。

ゴードン・リノフのソリューションへの追加:

  1. Teradata では、派生テーブルの代わりに QUALIFY を使用できます。
  2. ORDER BY が異なる 2 つの ROW_NUMBER は、計算に 2 つのステップが必要になります。MAX/MIN で書き直すと、1 つのステップに過ぎません。

これにより、

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 に答える