仅检索范围之间每个组的最后一条记录
Retrieve only last record of each group between range
我的table是
+-------+----------------+---------+--------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+--------------+-------------------+
| 42699 | 100 | 236 | 2021-05-19 | 2022-08-09 |
| 42693 | 100 | 236 | 2021-03-01 | 2022-08-09 |
| 42694 | 100 | 30 | 2021-03-01 | 2022-08-08 |
| 42695 | 100 | 235 | 2021-03-03 | 2022-08-09 |
| 42696 | 100 | 30 | 2021-05-01 | 2022-08-02 |
| 42697 | 100 | 235 | 2021-05-03 | 2022-08-04 |
| 42698 | 100 | 236 | 2021-05-04 | 2022-08-02 |
| 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 |
| 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 |
| 42702 | 100 | 236 | 2021-05-19 | 2022-08-09 |
+-------+----------------+---------+--------------+-------------------+
我想根据每个 user_id 组的 id 检索最后一条记录,但前提是它在 next_contact_date 范围
之间
期望输出
如果用户选择检索 2022-08-01 和 2022-08-15 之间的记录应该是
+-------+----------------+---------+--------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+--------------+-------------------+
| 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 |
| 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 |
| 42702 | 100 | 236 | 2021-05-19 | 2022-08-09 |
+-------+----------------+---------+--------------+-------------------+
效果很好!!!!
如果现在用户选择检索 2022-08-01 和 2022-08-05 之间的记录,它应该是空的,因为最后每个 user_id 组的 id 不在 next_contact_date.
内
我试过的
SELECT * FROM mytable WHERE id IN
(SELECT MAX(id) AS id FROM mytable where mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999' GROUP BY user_id)
我得到下面的结果,这不是我的 want.The 结果应该是空的,因为最后的记录不属于用户指定的 next_contact_date 范围。
+-------+----------------+---------+-----------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+-----------------+-------------------+
| 42696 | 100 | 30 | 2021-05-01 | 2022-08-02 |
| 42697 | 100 | 235 | 2021-05-03 | 2022-08-04 |
| 42698 | 100 | 236 | 2021-05-04 | 2022-08-02 |
+-------+----------------+---------+-----------------+-------------------+
您需要进一步的子查询来捕获所有 user_id,即在该时间范围内选择的。
并使用 user_ids 获取最后的 ID,但仅选择时间范围内的行
CREATE TABLE mytable
(`id` int, `invoice_number` int, `user_id` int, `created_date` date, `next_contact_date` date)
;
INSERT INTO mytable
(`id`, `invoice_number`, `user_id`, `created_date`, `next_contact_date`)
VALUES
(42699, 100, 236, '2021-05-19', '2022-08-09'),
(42693, 100, 236, '2021-03-01', '2022-08-09'),
(42694, 100, 30, '2021-03-01', '2022-08-08'),
(42695, 100, 235, '2021-03-03', '2022-08-09'),
(42696, 100, 30, '2021-05-01', '2022-08-02'),
(42697, 100, 235, '2021-05-03', '2022-08-04'),
(42698, 100, 236, '2021-05-04', '2022-08-02'),
(42700, 100, 30, '2021-05-19', '2022-08-08'),
(42701, 100, 235, '2021-05-20', '2022-08-08'),
(42702, 100, 236, '2021-05-19', '2022-08-09')
;
SELECT * FROM mytable WHERE id IN
(SELECT MAX(id) AS id FROM mytable
where `user_id` IN
(SELECT `user_id` FROM mytable WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999')
GROUP BY user_id)
AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date
-: | -------------: | ------: | :----------- | :----------------
SELECT * FROM mytable WHERE id IN
(SELECT MAX(id) AS id FROM mytable
where `user_id` IN
(SELECT `user_id` FROM mytable
WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999')
GROUP BY user_id)
AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date
----: | -------------: | ------: | :----------- | :----------------
42700 | 100 | 30 | 2021-05-19 | 2022-08-08
42701 | 100 | 235 | 2021-05-20 | 2022-08-08
42702 | 100 | 236 | 2021-05-19 | 2022-08-09
db<>fiddle here
我的table是
+-------+----------------+---------+--------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+--------------+-------------------+
| 42699 | 100 | 236 | 2021-05-19 | 2022-08-09 |
| 42693 | 100 | 236 | 2021-03-01 | 2022-08-09 |
| 42694 | 100 | 30 | 2021-03-01 | 2022-08-08 |
| 42695 | 100 | 235 | 2021-03-03 | 2022-08-09 |
| 42696 | 100 | 30 | 2021-05-01 | 2022-08-02 |
| 42697 | 100 | 235 | 2021-05-03 | 2022-08-04 |
| 42698 | 100 | 236 | 2021-05-04 | 2022-08-02 |
| 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 |
| 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 |
| 42702 | 100 | 236 | 2021-05-19 | 2022-08-09 |
+-------+----------------+---------+--------------+-------------------+
我想根据每个 user_id 组的 id 检索最后一条记录,但前提是它在 next_contact_date 范围
之间期望输出
如果用户选择检索 2022-08-01 和 2022-08-15 之间的记录应该是
+-------+----------------+---------+--------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+--------------+-------------------+
| 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 |
| 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 |
| 42702 | 100 | 236 | 2021-05-19 | 2022-08-09 |
+-------+----------------+---------+--------------+-------------------+
效果很好!!!!
如果现在用户选择检索 2022-08-01 和 2022-08-05 之间的记录,它应该是空的,因为最后每个 user_id 组的 id 不在 next_contact_date.
内我试过的
SELECT * FROM mytable WHERE id IN
(SELECT MAX(id) AS id FROM mytable where mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999' GROUP BY user_id)
我得到下面的结果,这不是我的 want.The 结果应该是空的,因为最后的记录不属于用户指定的 next_contact_date 范围。
+-------+----------------+---------+-----------------+-------------------+
| id | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+-----------------+-------------------+
| 42696 | 100 | 30 | 2021-05-01 | 2022-08-02 |
| 42697 | 100 | 235 | 2021-05-03 | 2022-08-04 |
| 42698 | 100 | 236 | 2021-05-04 | 2022-08-02 |
+-------+----------------+---------+-----------------+-------------------+
您需要进一步的子查询来捕获所有 user_id,即在该时间范围内选择的。
并使用 user_ids 获取最后的 ID,但仅选择时间范围内的行
CREATE TABLE mytable (`id` int, `invoice_number` int, `user_id` int, `created_date` date, `next_contact_date` date) ; INSERT INTO mytable (`id`, `invoice_number`, `user_id`, `created_date`, `next_contact_date`) VALUES (42699, 100, 236, '2021-05-19', '2022-08-09'), (42693, 100, 236, '2021-03-01', '2022-08-09'), (42694, 100, 30, '2021-03-01', '2022-08-08'), (42695, 100, 235, '2021-03-03', '2022-08-09'), (42696, 100, 30, '2021-05-01', '2022-08-02'), (42697, 100, 235, '2021-05-03', '2022-08-04'), (42698, 100, 236, '2021-05-04', '2022-08-02'), (42700, 100, 30, '2021-05-19', '2022-08-08'), (42701, 100, 235, '2021-05-20', '2022-08-08'), (42702, 100, 236, '2021-05-19', '2022-08-09') ;
SELECT * FROM mytable WHERE id IN (SELECT MAX(id) AS id FROM mytable where `user_id` IN (SELECT `user_id` FROM mytable WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999') GROUP BY user_id) AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date -: | -------------: | ------: | :----------- | :----------------
SELECT * FROM mytable WHERE id IN (SELECT MAX(id) AS id FROM mytable where `user_id` IN (SELECT `user_id` FROM mytable WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999') GROUP BY user_id) AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date ----: | -------------: | ------: | :----------- | :---------------- 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 42702 | 100 | 236 | 2021-05-19 | 2022-08-09
db<>fiddle here