簡體   English   中英

SQL-僅提取一次所有對

[英]SQL - extracting all pairs only once

問題陳述:

  • 具有N列的表格,其中K列用於確定行對
  • 這樣的涉及K列的標准可以簡單地是:如果對一對中兩個不同行的列c_1,c2,.. c_k相等(該標准本身不相關,僅是必須使用它的事實)
  • 要求是提取所有可能的對,但只能提取一次。 這意味着如果給定上述條件,如果一行中有超過2個可能形成一對的其他潛在行,則必須僅提取一對

簡單的例子:

輸入表:

A | B | C
x | y | z
w | y | z
u | y | z
u | v | z
v | v | z

標准:B和C列必須相同,兩行才能成對出現。

輸出:

x | y | z
w | y | z
u | v | z
v | v | z

對於純SQL(或Oracle方言,如果特定功能有幫助)解決問題,您有什么提示?

如果可以使用窗口分析功能:

CREATE TABLE TT1 (A VARCHAR(4), B VARCHAR(4), C VARCHAR(4))
INSERT INTO TT1 VALUES ('x','y','z')
INSERT INTO TT1 VALUES ('w','y','z')
INSERT INTO TT1 VALUES ('u','y','z')
INSERT INTO TT1 VALUES ('u','v','z')
INSERT INTO TT1 VALUES ('v','v','z')
INSERT INTO TT1 VALUES ('k','w','z')


SELECT A.A, A.B, A.C 
FROM
(SELECT *, ROW_NUMBER() OVER (PARTITION BY B,C ORDER BY A DESC) RN, COUNT(*) OVER (PARTITION BY B,C ) RC
FROM TT1) A
WHERE A.RN <=2 AND RC>1

輸出:

A    B    C
---- ---- ----
v    v    z
u    v    z
x    y    z
w    y    z

在要成對匹配的那些行上使用COUNT()分析函數分區:

SELECT A, B, C
FROM   (
  SELECT t.*,
         COUNT(*) OVER (
             PARTITION BY B, C
             ORDER BY A
             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
         ) AS current_rn,
         COUNT(*) OVER (
             PARTITION BY B, C
             ORDER BY A
             ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING
         ) AS next_rn
  FROM   table_name t
)
WHERE  MOD( current_rn, 2 ) = 0
OR     MOD( next_rn, 2 ) = 0;

輸出

A B C
- - -
u y z
w y z
u v z
v v z

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM