Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在每个客户有多张发票的表格中,我想确定每个客户的第一张发票(行)_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 在每个客户有多张发票的表格中,我想确定每个客户的第一张发票(行)

Mysql 在每个客户有多张发票的表格中,我想确定每个客户的第一张发票(行),mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我尝试过这一点,但并没有产生我所期望的效果: SELECT client_id, invoice_date, invoice_number, invoice_value FROM tblInvoices WHERE tblInvoices.invoice_date IN (SELECT min(tblInvoices.invoice_date) FROM tblInvoices GROUP BY client_

我尝试过这一点,但并没有产生我所期望的效果:

SELECT 
       client_id,
       invoice_date,
       invoice_number,
       invoice_value
FROM tblInvoices
WHERE tblInvoices.invoice_date IN
    (SELECT min(tblInvoices.invoice_date)
     FROM tblInvoices
     GROUP BY client_id)
GROUP BY client_id

您的子查询为每个单独的客户机获取最小发票日期,但客户机与其日期之间的链接丢失

SELECT client_id,
       invoice_date,
       invoice_number,
       invoice_value
FROM tblInvoices
WHERE (client_id, invoice_date) IN ( SELECT client_id, min(invoice_date)
                                     FROM tblInvoices
                                     GROUP BY client_id )

如果某个客户机存在多条具有相同最小日期的记录,则将返回所有记录。

我只需使用相关子查询来筛选表:

select t.*
from tblinvoices t
where t.invoice_date = (
    select min(t1.invoice_date) 
    from tblinvoices t1 
    where t1.client_id = t.client_id
)
此选项通常在适当索引的情况下产生良好的性能-在这里,您需要
(客户id、发票日期)
上的索引

另一个典型的解决方案是反左连接:

select t.*
from tblinvoices t
left join tblinvoices t1 
    on  t1.client_id = t.client_id
    and t1.invoice_date < t.invoice_date
where t1.client_id is null
选择t*
来自TBLint
左连接TBLint1
在t1.client\u id=t.client\u id上
t1.发票日期
您可以通过使用子查询联接将每个用户的发票日期与其最小值进行核对来获取客户机及其数据

SELECT client_id,
       invoice_date,
       invoice_number,
       invoice_value
FROM tblInvoices AS upper_table
WHERE invoice_date IN (
                        SELECT min(invoice_date)
                        FROM tblInvoices
                        WHERE upper_table.client_id=tblInvoices.client_id
                      )

这是一个众所周知的问题,有多种解决方案。此查询使用具有内部联接的不相关子查询:

SELECT 
    t.client_id,
    invoice_date,
    invoice_number,
    invoice_value
FROM tblInvoices t
JOIN (
    SELECT client_id, MIN(invoice_date) AS min_invoice_date
    FROM tblInvoices
    GROUP BY client_id
) sq ON t.client_id = sq.client_id AND t.invoice_date = sq.min_invoice_date
但是,如果给定客户的最小发票日期不是唯一的(列
发票_日期
可能是
日期
类型;未指定该类型),该怎么办?然后,上面的SQL将为该客户机返回多行。然后,我们可能希望返回包含最小发票日期和最小发票编号的行:

SELECT 
    t.client_id,
    invoice_date,
    invoice_number,
    invoice_value
FROM tblInvoices t
JOIN (
    SELECT t.client_id, MIN(invoice_number) AS min_invoice_number from tblInvoices t JOIN (
       SELECT client_id, MIN(invoice_date) AS min_invoice_date
       FROM tblInvoices
       GROUP BY client_id
    ) sq ON t.client_id = sq.client_id AND t.invoice_date = sq.min_invoice_date
    GROUP BY t.client_id
) sq2 ON /* t.client_id = sq2.client_id AND */ t.invoice_number = sq2.min_invoice_number

我假设在上面的SQL中,
invoice\u number
列是唯一的键。

MySQL只在整个记录上实现DISTINCT。这不是postgresql,它允许在部分字段集上区分输出。@Akina谢谢,你说得对。我们可以在不添加
DISTINCT
的情况下得到相同的结果。