MySQL每组获取一条记录

标签 mysql greatest-n-per-group

我有一个 MySQL 表 targeted_refills,其中包含以下列:id(唯一的主键)、pat_namepat_phone, rx_number, drug_name, qty_disp, last_date, qty_left, price_codelast_pricelast_contactdoc_nameehfuserid

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

编辑:

我试过从另一个人的问题中拼凑出来的这个查询:

SELECT t1.*
FROM `targeted_refills` AS t1
LEFT OUTER JOIN `targeted_refills` AS 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))
WHERE t2.userid IS NULL;

它在到达我想去的地方方面做得很合理,但它拉出的记录比我想要的多。我现在正在比较以查看它拉动了哪些额外记录以及原因。它也需要很长时间才能运行。

最佳答案

已更新 您可以稍微调整现有的查询:您至少需要一个连接条件来防止 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 两个查询的演示。

关于MySQL每组获取一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115899/

相关文章:

python - 检查 pyodbc 连接是打开还是关闭

循环不返回值的函数

mysql - 根据两列选择每组中的最佳行

mysql - 在 JOIN 中使用 DISTINCT 会造成麻烦

mysql - Solr - DIH 定义和导入多对多字段

MySQL - 选择 JSON 键对值的数据

php - MySQL 将存储日期与当前日期进行比较并执行

mysql - 无法从 mysql 数据库获取记录

sql - 如何从表中查找最小和最大行,包括来自 postgresql 的所有列

SQL Server : How to de-duplicate on two columns/conditions?