簡體   English   中英

MySQL:按多列分組時選擇第一行或最后一行

[英]MySQL: SELECT First or Last Rows When Grouping By Multiple Columns

我有一個SQL表,其中包含一些項目的銷售數據。 實際上,它具有項目銷售的日志。

例如,某筆交易包含2個項目:鍵盤( id:1 )和鼠標( id:2 )。 買家可以對每個項目進行多次出價,例如ebay。 因此,假設有2個買家( ids are 97 and 98 )進行了幾次出價。 相關數據為:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   44.26       |   2014-01-20 15:53:16 |
2       |   98          |   2       |   30.47       |   2014-01-20 15:54:52 |
3       |   97          |   2       |   40.05       |   2014-01-20 15:57:47 |
4       |   97          |   1       |   42.46       |   2014-01-20 15:58:36 |
5       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
6       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
7       |   98          |   2       |   28          |   2014-01-20 16:08:42 |
8       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |

在此表中,我需要為每個用戶的第一個商品報價和每個用戶的最后一個報價選擇數據。

因此,如果我為每個用戶(不同)選擇第一項報價,則返回數據應類似於:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   44.26       |   2014-01-20 15:53:16 |
2       |   98          |   2       |   30.47       |   2014-01-20 15:54:52 |
3       |   97          |   2       |   40.05       |   2014-01-20 15:57:47 |

如果我為每個用戶選擇最后一個優惠,則退貨應為:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
5       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
6       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
8       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |

由於必須為每個用戶攜帶每件商品,因此我嘗試對buyer_iditem_idbuyer_id GROUP BY ,然后SELECT timebid_idMIN值。 但是,它總是向我返回第一個bid_id但返回最近的amount行(實際上是最后報價)。

這是我嘗試過的查詢:

SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id`

結果是:

bid_id  |   buyer_id    |   item_id |   amount      |   time                |
1       |   97          |   1       |   39.99       |   2014-01-20 16:01:13 |
2       |   97          |   2       |   24.68       |   2014-01-20 16:05:35 |
3       |   98          |   2       |   26.75       |   2014-01-20 16:13:23 |

如您所見,它的分組依據和ID是正確的,但其余的行值卻不是。

分組購買多列時如何正確SELECT第一行和/或最后一行?

SELECT o.`bid_id`,o.`buyer_id`,o.`item_id`,o.`amount`,o.`time` FROM `offers` o
JOIN
(SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id`)x
ON x.bid_id=o.bid_id  AND x.buyer_id=o.buyer_id

這是另一個使用Quassnoi的排名技巧的方法

對於第一個出價:

SELECT x.bid_id, x.buyer_id, x.item_id, x.amount, x.time 
FROM 
(
  SELECT o.bid_id, o.buyer_id, o.item_id, o.amount, o.time, 
    @combo :=CASE WHEN NOT(@curItem = o.item_id AND @curBuyer = o.buyer_id) 
                  THEN 1 ELSE @combo+1 END AS Rank,
    @curItem:=o.item_id AS item,
    @curBuyer:=o.buyer_id AS buyer
  FROM
  (
    SELECT o.bid_id, o.buyer_id, o.item_id, o.amount, o.time 
      FROM offers o
      ORDER BY o.buyer_id, o.item_id, o.bid_id
  ) o,
  (SELECT @curItem := -1) itm,
  (SELECT @curBuyer:= -1) buy
) x
WHERE x.Rank = 1;

對於最后一個出價查詢,您只需將ORDER BY更改為o.buyer_id, o.item_id, o.bid_id DESC

SqlFiddle在這里

首先提供sql:

SELECT
*
FROM
    offers AS o1
WHERE
NOT EXISTS (
    SELECT
        1
    FROM
        offers o2
    WHERE
        o1.buyer_id = o2.buyer_id
    AND o1.item_id = o2.item_id
    AND datetime(o1.time) > datetime(o2.time)
)

最后提供sql:只需更改為datetime(o1.time)<datetime(o2.time)(我使用sqlite〜)

請嘗試在下面的查詢中查詢所需的輸出。 SQL鏈接: http ://sqlfiddle.com/#!2/916c2/15

    (select f.bid_id,f.buyer_id,f.item_id,f.amount,f.time from offers f join
    (select buyer_id,item_id,min(time) as time from offers
    group by buyer_id,item_id)t
    on f.buyer_id=t.buyer_id and f.item_id=t.item_id
    and f.time=t.time)
    union
    (select f.bid_id,f.buyer_id,f.item_id,f.amount,f.time from offers f join
    (select buyer_id,item_id,max(time) as time from offers
    group by buyer_id,item_id)t
    on f.buyer_id=t.buyer_id and f.item_id=t.item_id
    and f.time=t.time);

暫無
暫無

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

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