2013-03-27 15 views
0
回到2號線

我想拉每USERID 2行,第一行是與最早的日期(RSLVD_DTTM),第二個是與最新的(RSLVD_DTTM)基於1日和最後一個條目

這裏是什麼我目前有

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' 

任何幫助,將不勝感激。

+1

您需要添加更多關於這兩行內容的信息。我看不到任何可以說明你爲什麼只想選擇那兩行的內容。 – 2013-03-27 15:44:26

+1

我想選擇那些行,因爲RSLVD_DTTM,我希望它從最舊的條目到最新的條目之間...沒有任何內容。 – 2013-03-27 15:48:06

+0

請通過添加適當的標記(Oracle,SQL Server,MySQL等)來指定您要定向的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。另外,通過使用特定的RDBMS標記它,您的問題可能會得到更好的回答的人的關注 – Taryn 2013-03-27 15:53:15

回答

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 

大多數數據庫支持此功能。

順便說一下,我不明白你的查詢。連接條件應該使用現代連接語法而不是,

+0

+1「我不明白你的問題。」 (我也不!)。 -1「連接條件應該使用現代語法...」(哪個權威?)。 +1好的解決方案。 1-1 + 1 = 1。 :-) – Sepster 2013-03-27 16:11:34

+0

即時通訊使用TeraData,我似乎得到一個錯誤。這會適合teradata嗎? – 2013-03-27 16:16:35

+0

@ErrolGreen。 。 。什麼樣的錯誤。 Teradata肯定支持'row_number()'。 'in in'是一個不尋常的結構;通常這只是「在」。我在子查詢中有一個額外的逗號,但現在已修復。 – 2013-03-27 17:10:32

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')) 
+0

-1我認爲你需要在用戶的子查詢中進行分組嗎?糾正我,如果我錯了,我會刪除downvote。做一次聚合會更好嗎,而不是在兩次子查詢中做兩次?或者,數據庫管理系統可能更願意加入兩個單獨的結果集,而不是我的解決方案,而不是加入一個OR,你認爲呢?即給你的代表,我真的對你的意見感興趣。 – Sepster 2013-03-27 16:25:46

+0

@Sepster - 在子查詢中進行篩選就足夠了。由於只有一個值被選中,因此不需要分組。至於兩者之間的表現差異,我不確定哪一個更可取。你必須簡介和看看。 – 2013-03-27 17:47:53

+0

我沒有意識到它是有效的語法,儘管它確實是合乎邏輯的。我會爲你的帖子提出一個小小的修改,因爲我不能刪除我的downvote,直到它被編輯,對不起。謝謝你讓我變直! – Sepster 2013-03-27 23:19:08

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語法,請告訴我,我會看看我能做什麼!

0

正如其他人已經告訴你,兩個表之間沒有真正的連接條件。

添加到戈登·利諾夫的解決方案:

  1. 您可以使用QUALIFY而不是派生表在Teradata的
  2. 2個ROW_NUMBERs不同ORDER BY會導致兩個步驟進行計算,當你與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 
相關問題