MySQL每组获得一条记录

时间:2013-06-14 19:28:14

标签: mysql greatest-n-per-group

我有一个MySQL表targeted_refills,其中包含以下列:id(唯一,主键),pat_namepat_phonerx_number,{{1} },drug_nameqty_displast_dateqty_leftprice_codelast_pricelast_contactdoc_nameehf

我要做的是列出每个userid的一条记录。我想列出的记录是基于字段userid的最新记录,但是如果该用户的记录多于最近日期,那么我希望它选择字段中具有最大值的字段last_date。在极少数情况下,有两个匹配last_pricelast_date的记录(不应该发生但可能),我真的不关心选择哪个,因此可以选择最大值last_price,因为它是唯一的和主键。

编辑:

我尝试过这个问题,我从另一个人的问题拼凑而成:

id

它可以合理地找到我想去的地方,但它会比我想要的还要多一些记录。我现在正在比较,看看有什么额外的记录和原因。它也需要很长时间才能运行。

1 个答案:

答案 0 :(得分:0)

更新您可以稍微调整现有查询:当last_datelast_price在多行中相等时,您需要至少一个连接条件以防止重复。由于您已自动生成id,因此可以使用它来区分行。

SELECT t1.*
  FROM targeted_refills t1 LEFT JOIN targeted_refills t2
    ON t1.userid = t2.userid 
   AND (
         t1.last_date < t2.last_date 
         OR 
         (t1.last_date = t2.last_date AND 
          t1.last_price < t2.last_price)
         OR
         (t1.last_date = t2.last_date AND 
          t1.last_price = t2.last_price AND
          t1.id < t2.id)         
       )
WHERE t2.userid IS NULL;

或者你可以用另一种方式实现你的目标

SELECT id, pat_name, pat_phone, rx_number, drug_name, 
       qty_disp, last_date, qty_left, price_code, 
       last_price, last_contact, doc_name, ehf, userid
  FROM 
(
  SELECT r.*,
         @n := IF(@u = userid, @n + 1, 1) rownum,
         @u := userid
    FROM targeted_refills r
   ORDER BY userid, last_date DESC, last_price DESC
) q
 WHERE q.rownum = 1

以下是两个查询的 SQLFiddle 演示。