当前在线人数7524
首页 - 分类讨论区 - 电脑网络 - 数据库版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
Re: 出个更难的sql题
[版面:数据库][首篇作者:TheMatrix] , 2019年11月04日12:15:41 ,1798次阅读,44次回复
来APP回复,赚取更多伪币 关注本站公众号:
[首页][上页] [下页][末页] [分页:1 2 3 ]
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 10:36:54 2019, 美东)

p1是本来的值,new_p1是填入空白之后的值,将来是用来代替p1的。对,new_p1的值和
p1的值有关。

规则是这样的:本来不是空白的地方不动;空白的地方填入前面最近的一个不是空白的
值,如果没有,那也不动,还是空白。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: The logic is little confused.
: On row 3, why new_p1 = 3 ?  it should be the pre-row vlaue = 0 right?
: Could you double check your logic? Is it related to current row p1 value?





--
☆ 发自 iPhone 买买提 1.24.11
--
※ 修改:·TheMatrix 於 Nov  7 10:40:39 2019 修改本文·[FROM: 2607:fb90:b68d:8]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 10:53:55 2019, 美东)


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: p1是本来的值,new_p1是填入空白之后的值,将来是用来代替p1的。对,new_p1的值和
: p1的值有关。
: 规则是这样的:本来不是空白的地方不动;空白的地方填入前面最近的一个不是空白的
: 值,如果没有,那也不动,还是空白。


so, if p1 <> null and p1 <> 0, then new_p1 = p1

else new_p1 = 前面最近的一个不是空白的值

right?
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 11:29:18 2019, 美东)

对。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: so, if p1 <> null and p1 <> 0, then new_p1 = p1
: else new_p1 = 前面最近的一个不是空白的值
: right?




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 11:31:56 2019, 美东)

CREATE TABLE THEMATRIXDATA
(
    PRODUCT    VARCHAR2 (1),
    SEQ        INTEGER,
    P1         INTEGER,
    P2         INTEGER
);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             1,
             0,
             5);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             2,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             3,
             3,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             4,
             3,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             5,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             6,
             0,
             6);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             7,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('A',
             8,
             4,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             1,
             0,
             5);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             2,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             3,
             3,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             4,
             3,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             5,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             6,
             0,
             6);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             7,
             0,
             0);

INSERT INTO THEMATRIXDATA (PRODUCT,
                           SEQ,
                           P1,
                           P2)
     VALUES ('B',
             8,
             4,
             0);

COMMIT;



  SELECT PRODUCT,
         SEQ,
         P1,
         P2,
         LAG (P1) OVER (ORDER BY PRODUCT, SEQ)     PRE_P1
    FROM THEMATRIXDATA
ORDER BY PRODUCT, SEQ;


  SELECT PRODUCT,
         SEQ,
         P1,
         P2,
         DECODE (P1,  NULL, -1,  0, -1,  1)        AS P1_FLAG, -- CHECK IF
P1 VALUE IS USABLE
         DECODE (P2,  NULL, -1,  0, -1,  1)        AS P2_FLAG, -- CHECK IF
P2 VALUE IS USABLE
         LAG (P1) OVER (ORDER BY PRODUCT, SEQ)     AS PRE_ROW_P1,
         LAG (P2) OVER (ORDER BY PRODUCT, SEQ)     AS PRE_ROW_P2
    FROM THEMATRIXDATA
ORDER BY PRODUCT, SEQ;



SELECT PRODUCT,
       SEQ,
       P1,
       P2,
       P1_FLAG,
       P2_FLAG,
       PRE_ROW_P1,
       PRE_ROW_P2,
       PRE_ROW_P1_FLAG,
       PRE_ROW_P2_FLAG,
       DECODE (
           P1_FLAG,
           1, P1,
           DECODE (PRE_ROW_P1_FLAG,
                   1, PRE_ROW_P1,
                   LAG (PRE_ROW_P1) OVER (ORDER BY PRODUCT, SEQ)))    AS NEW
_P1
  FROM (  SELECT PRODUCT,
                 SEQ,
                 P1,
                 P2,
                 DECODE (P1,  NULL, -1,  0, -1,  1)
                     AS P1_FLAG,                -- CHECK IF P1 VALUE IS
USABLE
                 DECODE (P2,  NULL, -1,  0, -1,  1)
                     AS P2_FLAG,                -- CHECK IF P2 VALUE IS
USABLE
                 LAG (P1) OVER (ORDER BY PRODUCT, SEQ)
                     AS PRE_ROW_P1,
                 LAG (P2) OVER (ORDER BY PRODUCT, SEQ)
                     AS PRE_ROW_P2,
                 DECODE (LAG (P1) OVER (ORDER BY PRODUCT, SEQ), 0, -1, 1)
                     AS PRE_ROW_P1_FLAG,
                 DECODE (LAG (P2) OVER (ORDER BY PRODUCT, SEQ), 0, -1, 1)
                     AS PRE_ROW_P2_FLAG
            FROM THEMATRIXDATA
        ORDER BY PRODUCT, SEQ);
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 11:44:48 2019, 美东)

我把幾乎每一步拆分給你。 以免你看不清楚。

最後一步你要自己完成, 呵呵。 那就是, 要是 NEW_P1 是 NULL就設為0 ,  是 0
你要使用上一個非零的值。 用DECODE inline 就可以完成。

另外, 黑色箭頭是涉及 A B 類別的重設, 您自己簡單處理一下

see attached img
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]


此主题相关图片如下:

[删除]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 11:46:44 2019, 美东)

Oracle decode function 是非常好用的。 不知道 SQL 有沒有。

代碼僅供參考。我只是想您能容易理解, 因此寫的比較囉嗦。您自己可以簡化很多。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: 我把幾乎每一步拆分給你。 以免你看不清楚。
: 最後一步你要自己完成, 呵呵。 那就是, 要是 NEW_P1 是 NULL就設為0 ,  是 0
: 你要使用上一個非零的值。 用DECODE inline 就可以完成。
: 另外, 黑色箭頭是涉及 A B 類別的重設, 您自己簡單處理一下
: see attached img




--
※ 修改:·nmamtf 於 Nov  7 11:48:44 2019 修改本文·[FROM: 152.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 12:00:44 2019, 美东)

This one separated product value.

You can keep working on it. I don't have much time to complete all of them.

SELECT PRODUCT,
       SEQ,
       P1,
       P2,
       P1_FLAG,
       P2_FLAG,
       PRE_ROW_P1,
       PRE_ROW_P2,
       PRE_ROW_P1_FLAG,
       PRE_ROW_P2_FLAG,
       PRODUCT_FLAG,
      
       DECODE(PRODUCT_FLAG, 1, P1, DECODE (P1_FLAG,1, P1,
           DECODE (PRE_ROW_P1_FLAG,
                   1, PRE_ROW_P1,
                   LAG (PRE_ROW_P1) OVER (ORDER BY PRODUCT, SEQ)))) AS NEW_
P1
  FROM (  SELECT PRODUCT,
                 SEQ,
                 P1,
                 P2,
                 DECODE (P1,  NULL, -1,  0, -1,  1) AS P1_FLAG,            
  
                 DECODE (P2,  NULL, -1,  0, -1,  1)AS P2_FLAG,             
 
                 LAG (P1) OVER (ORDER BY PRODUCT, SEQ) AS PRE_ROW_P1,
                 LAG (P2) OVER (ORDER BY PRODUCT, SEQ) AS PRE_ROW_P2,
                 DECODE (LAG (P1) OVER (ORDER BY PRODUCT, SEQ), 0, -1, 1) AS
PRE_ROW_P1_FLAG,
                 DECODE (LAG (P2) OVER (ORDER BY PRODUCT, SEQ), 0, -1, 1) AS
PRE_ROW_P2_FLAG,
                 DECODE (LAG (PRODUCT) OVER (ORDER BY PRODUCT, SEQ), PRODUCT
, 0, 1) AS PRODUCT_FLAG
            FROM THEMATRIXDATA
        ORDER BY PRODUCT, SEQ);
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 12:34:34 2019, 美东)

我出题之前就已经做出来了。我的代码比你的简练的多,而且是百分之百的标准SQL,
而且是one single SQL statement。

你这个答案的正确性我现在只能目测,我有所怀疑。因为one single lag function应
该是解决不了问题的。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: This one separated product value.
: You can keep working on it. I don't have much time to complete all of them.
: SELECT PRODUCT,
:        SEQ,
:        P1,
:        P2,
:        P1_FLAG,
:        P2_FLAG,
:        PRE_ROW_P1,
:        PRE_ROW_P2,
: ...................




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 13:23:08 2019, 美东)

我寫的複雜時怕你看不懂, 卻不知道你這是閒著沒事幹逗大家玩?!

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 我出题之前就已经做出来了。我的代码比你的简练的多,而且是百分之百的标准SQL,
: 而且是one single SQL statement。
: 你这个答案的正确性我现在只能目测,我有所怀疑。因为one single lag function应
: 该是解决不了问题的。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 13:29:19 2019, 美东)

我验证了,你的不对。你的答案只填了连续的两个空白,如果空白超过两个,你的还是
空白。

空白数目不定,任何固定个数的用法都不能解决问题。

我手上没有oracle,但是decode function可以用case when改写。附图是你最后一个
sql的改写和结果。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: This one separated product value.
: You can keep working on it. I don't have much time to complete all of them.
: SELECT PRODUCT,
:        SEQ,
:        P1,
:        P2,
:        P1_FLAG,
:        P2_FLAG,
:        PRE_ROW_P1,
:        PRE_ROW_P2,
: ...................




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]


此主题相关图片如下:

[删除]

此主题相关图片如下:
[删除]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 13:33:05 2019, 美东)

这怎么是逗大家玩?程序员切磋算法和语言,以码会友,有毛病吗?

【 在 nmamtf (nmamtf) 的大作中提到: 】
: 我寫的複雜時怕你看不懂, 卻不知道你這是閒著沒事幹逗大家玩?!




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 17 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 13:52:20 2019, 美东)

呵呵, 沒毛病, 是我自己賤。

其實, 更簡單, 而且靈活的方法可以不用嵌套表 AND LAG, 一步就得到理想的值。
因為在數據量超大的情況下, LAG 會造成速度下降的問題。嵌套的 LAG 會問題更大。
可惜你不是實際需要, 就沒必要深入說了。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 这怎么是逗大家玩?程序员切磋算法和语言,以码会友,有毛病吗?






--
※ 修改:·nmamtf 於 Nov  7 14:41:45 2019 修改本文·[FROM: 152.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 18 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 14:53:38 2019, 美东)


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 我验证了,你的不对。你的答案只填了连续的两个空白,如果空白超过两个,你的还
是空白。

你這人不好好看帖子。 我樓上已經告訴你:

『最後一步你要自己完成, 呵呵。 那就是, 要是 NEW_P1 是 NULL就設為0 ,  是 0
你要使用上一個非零的值。 用DECODE inline 就可以完成。』

並附上圖, 用箭頭標注出你需要自己完成的部分。

: 空白数目不定,任何固定个数的用法都不能解决问题。
: 我手上没有oracle,但是decode function可以用case when改写。附图是你最后一个
: sql的改写和结果。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 19 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 15:09:19 2019, 美东)

哦。那我也不好意思啊。我原贴说的是出个题大家玩一下,并没有说请人帮忙,不过我
话说的太软,可能给你的印象是求人帮忙,看到你第一个回贴我估计你是这么想的,但
是我也没澄清,不过你后来说话有点居高临下了,所以我就没客气。这里有误会。

我贴我的算法吧。

用的是两个row_number函数相减的方法,得到内容的grouping,同时把每一个grouping
中第一个值得到,用的是lead desc,然后再用first_value把这个值spread出去。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: 呵呵, 沒毛病, 是我自己賤。
: 其實, 更簡單, 而且靈活的方法可以不用嵌套表 AND LAG, 一步就得到理想的值

: 因為在數據量超大的情況下, LAG 會造成速度下降的問題。嵌套的 LAG 會問題更大。
: 可惜你不是實際需要, 就沒必要深入說了。




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]


此主题相关图片如下:

[删除]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 20 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 15:18:53 2019, 美东)

你这样说我觉得不行。decode inline完成。怎么完成?空白的数目不定,这里必须有
一个相当于循环的东西。你完成一下看看嘛。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: 是空白。
: 你這人不好好看帖子。 我樓上已經告訴你:
: 『最後一步你要自己完成, 呵呵。 那就是, 要是 NEW_P1 是 NULL就設為0 ,  是
0
:  你要使用上一個非零的值。 用DECODE inline 就可以完成。』
: 並附上圖, 用箭頭標注出你需要自己完成的部分。




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 21 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 16:01:09 2019, 美东)

呵呵, 我的代碼僅僅是說明一個邏輯判斷過程。

對你的數據, inline 就夠了。 對不定數據, 用我上面說的, 簡單分區就可以了,
連 LAG 都不用。 不過, 初學恐怕不能理解。

要是用 Oracle MODEL 和  DIMENSION BY 和 RULES 就更簡單。
不過我對 SQL server 所知甚少, 不知道它有沒有類似的功能。

Hint is here:

P1[ANY] = DECODE(P1[CV(RN)], 0, NVL(P1[CV(RN) - 1], 0), P1[CV(RN)]),

Can you convert above into SQL ? 呵呵

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 你这样说我觉得不行。decode inline完成。怎么完成?空白的数目不定,这里必须有
: 一个相当于循环的东西。你完成一下看看嘛。
:  0






--
※ 修改:·nmamtf 於 Nov  7 16:53:37 2019 修改本文·[FROM: 152.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 22 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 18:08:29 2019, 美东)

又想了一下,这个问题实际上没有本版前面出现的那个问题难。用两个row_number相减
的技巧当然也可以,但是实际上是over kill。用普通的区间的办法就可以解决。见附
图。

考虑这个问题和本版前面那个问题的区别,这个问题是要解决一个特殊值,就是空白。
而那个问题每个值都可能形成小的区间。所以这个问题实际上没有那个问题难。

这几天在写一个sql,刚好碰到这个问题,row_number相减的技巧实在忍不住不用。不
过我实际问题中比这个复杂,单线索order by还不行,所以我又改了,改成了目前的做
法。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 前面版上有一个sql题比较难,是把record有效区间根据内容扩展,这样使碎片的有效
: 区间可以合并成大的有效区间。这个问题还是一个很常见的问题,我后来又遇到过好几
: 次。本版最佳答案是用两个row_number函数相减。这是神来之笔啊。我自己也做了答案
: ,但是比这个神来之笔差不少。现在我自己的答案我已经不记得了,每次都是用这个神
: 来之笔的答案。
: 最近又碰到一个相关的问题。更难。但是有了前面的基础,应该还是能做出来的。出给
: 大家玩一下。先看一下附图中的数据。
: 这个数据中有一个product和seq。seq是序号,也可以换成data effective date,就是
: 一个顺序的标志,不一定连续。p1,p2是数据内容。但是内容中有空白,用0表示。不是
: 0的地方才是真正的数据。
: ...................




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]


此主题相关图片如下:

[删除]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 23 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 18:15:09 2019, 美东)

SQL Server里没有这些。这些不是函数,是关键字,改不了。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: 呵呵, 我的代碼僅僅是說明一個邏輯判斷過程。
: 對你的數據, inline 就夠了。 對不定數據, 用我上面說的, 簡單分區就可以了

: 連 LAG 都不用。 不過, 初學恐怕不能理解。
: 要是用 Oracle MODEL 和  DIMENSION BY 和 RULES 就更簡單。
: 不過我對 SQL server 所知甚少, 不知道它有沒有類似的功能。
: Hint is here:
: P1[ANY] = DECODE(P1[CV(RN)], 0, NVL(P1[CV(RN) - 1], 0), P1[CV(RN)]),
: Can you convert above into SQL ? 呵呵




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

 
nmamtf
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 24 ]

发信人: nmamtf (nmamtf), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 18:39:43 2019, 美东)

ORACLE 很簡單。 一句話就OK 了。 比如, 對於單一產品 A,

你比較一下, 看看那個簡單?


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: SQL Server里没有这些。这些不是函数,是关键字,改不了。
: ,



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 152.]


此主题相关图片如下:

[删除]

此主题相关图片如下:
[删除]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 25 ]

发信人: TheMatrix (TheMatrix), 信区: Database
标  题: Re: 出个更难的sql题
发信站: BBS 未名空间站 (Thu Nov  7 19:31:21 2019, 美东)

不错。谢谢。

【 在 nmamtf (nmamtf) 的大作中提到: 】
: ORACLE 很簡單。 一句話就OK 了。 比如, 對於單一產品 A,
: 你比較一下, 看看那個簡單?




--
☆ 发自 iPhone 买买提 1.24.11
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:b68d:]

[首页][上页] [下页][末页] [分页:1 2 3 ]
[快速返回] [ 进入数据库讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996