2015-07-21 81 views
0

請大家幫忙, 這是我的表如何比較2行中同表

date  column1 column2   trx 
2015-07-01 **side1 Internet**  777903315 
2015-07-01 **side1 Internet**  41426210 
2015-07-01 side1  Unlimited  2263500 
2015-07-01 side1  Business   427000 
2015-07-01 side1  Extreme   3540900 
2015-07-01 side1  Lifestyle  59360000 
2015-07-01 side1  Socialita  240850500 
2015-07-01 **side2 Unlimited**   6160 
2015-07-01 **side2 Unlimited** 113502000 

,我想選擇具有這樣的結果,我的表​​:

date  column1 column2   trx  type 
2015-07-01 **side1 Internet**  777903315 pre 
2015-07-01 **side1 Internet**  41426210 post 
2015-07-01 side1  Unlimited  2263500 pre 
2015-07-01 side1  Business   427000 pre 
2015-07-01 side1  Extreme   3540900 pre 
2015-07-01 side1  Lifestyle  59360000 pre 
2015-07-01 side1  Socialita  240850500 pre 
2015-07-01 **side2 Unlimited**   6160 post 
2015-07-01 **side2 Unlimited** 113502000 pre 

行具有相同的值在第1列和第2列中,最小trx添加字段後面的行爲類型'post'和最大'pre'

+2

我不知道你問這裏。 – PKirby

+1

你到目前爲止嘗試過什麼?在我看來,具有左連接或子查詢的case語句可能就是你正在尋找的。 –

+0

@PKirby他從他的表格發佈了原始數據,然後發佈了他想要顯示記錄的順序。這就是他要問的。 現在我看到有不同的答案,所以也許它不是很清楚。 我明白他希望它按第1欄和第2欄排序,而忽略後綴 –

回答

0
SELECT t.date, t.c1, t.c2, t.trx 
    , CASE WHEN t.trx = m.trx THEN 'pre' ELSE 'post' END AS `type` 
    FROM so_q31531850 t 
    LEFT OUTER JOIN (SELECT DATE, c1, c2, MAX(trx) AS trx FROM so_q31531850 GROUP BY 1,2,3) m 
       ON m.trx = t.trx AND m.c1 = t.c1 AND m.c2 = t.c2 AND m.date = t.date 

請注意,如果交易數量是一樣的,我的建議的查詢將其視爲post類型的條目。

+0

交易號碼是不同的,那爲什麼我要添加'type'列 –

+0

然後這個查詢應該工作... –

1

您可以使用以下查詢:

SELECT m.*,  
     CASE trx 
      WHEN mintrx THEN 'post' 
      WHEN maxtrx THEN 'pre' 
      ELSE 'pre' 
     END AS type 
FROM mytable AS m 
LEFT JOIN (
    SELECT column1, column2, MIN(trx) AS mintrx, MAX(trx) AS maxtrx 
    FROM mytable 
    GROUP BY column1, column2 
    HAVING MIN(trx) <> MAX(trx)) AS t 
ON m.column1 = t.column1 AND m.column2 = t.column2 

此查詢執行LEFT JOIN,其派生表只包含重複的column1,column2行。最小值/最大值trx匹配分別產生post/pre值,而pre是非匹配錶行的默認值。

Demo here

+0

我不知道,但是當我使用你的查詢,一些數據沒有趕上前和後 –

+0

@daffy在這種情況下,你的真實數據與你的樣本數據不同。你能發佈一個包含這種「未捕獲」數據的摘錄嗎? –

0

下面的查詢(SQL)給出了上面給出所需的格式結果:

SELECT Date,column1,column2,trx 
,CASE RANK() OVER(PARTITION BY Date,col1,col2 ORDER BY trx DESC) 
    WHEN 1 THEN 'pre' 
    ELSE 'post' 
    END as type 
FROM [TableName] 
+0

'RANK'在MySQL –

0

也許這代碼來完成好一點,我不是一個SQL的人自己,但很好玩與小提琴。

下面是一個示例表:

CREATE TABLE EXAMPLE (
    id INT, 
    c1 NVARCHAR(100), 
    c2 NVARCHAR(100)   
    ); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (1, '**side1', 'Internet**'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (2, '**side2', 'Unlimited**'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (3, 'side1', 'Unlimited'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (4, 'side1', 'Lifestyle'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (5, 'side1', 'Buisness'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (6, '**side2', 'Unlimited**'); 

INSERT INTO EXAMPLE (ID,c1,c2) 
VALUES (7, '**side1', 'Internet**'); 

查詢:

select * from Example 
order by 
    case 
     when c1 like '**%' then substring(c1,3,Len(c1)) else c1 
    end,c1 ,c2 desc; 
+0

中是不可用的** **就像行標記一樣某些列中的值 –