2015-07-21 127 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

中是不可用的** **就像行标记一样某些列中的值 –