我有两张桌子。
表1
ID-ORDER_ID-STATUS_ID-CREATE_DATE
1-4322-100-02.01.2019
2-4322-2-03.01.2019
3-5677-100-05.01.2019
4-4322-3-09.01.2019
5-9987-2-17.01.2019
6-4322-11-02.02.2019
7-5677-3-22.01.2019
表2
STATUS_ID-STATUS_NAME
100-Odeme AliNdi
2-西帕里什哈泽尔兰尼约尔
7-Iptal edildi
3-德波切克什河亚普尔德河
9-Teslim edidi
12-伊迪尔迪
我必须编写一个查询来创建此报告:
ORDER_ID-FIRST_STATUS_NAME-FIRST_STATUS_DATE-LAST_STATUS_NAME-LAST_STATUS_DATE
4322-奥德梅-2019年1月20日-不详-2019年2月20日
5677-奥德梅-2019年1月5日-德波切克-2019年1月22日
9987-西帕里什哈泽尔兰河-2019年1月17日-西帕里什哈泽尔兰河-
2019年1月17日
我知道我必须使用INNER JOIN和sub select查询,但我是一个刚使用SQL的用户,我试图用三天的时间来编写这个查询。 但我做不到。 这是我糟糕的考验。
SELECT ORDER_ID, (SELECT STATUS_NAME FROM Tablo-2 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MIN(CREATE_DATE) ) AS FIRST_STATUS_NAME,
(SELECT CREATE_DATE FROM Tablo-1 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MIN(CREATE_DATE) ) AS FIRST_STATUS_DATE,
(SELECT STATUS_NAME FROM Tablo-2 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MAX(CREATE_DATE) ) AS LAST_STATUS_NAME,
(SELECT CREATE_DATE FROM Tablo-1 WHERE STATUS_ID.Tablo-1=STATUS_ID.Tablo-2 GROUP BY ORDER_ID HAVING MAX(CREATE_DATE) ) AS LAST_STATUS_DATE
FROM Table1, Table2 ORDER BY CREATE_DATE ASC
和
SELECT STATUS_NAME FROM table1, table2,
(SELECT ORDER_ID, STATUS_ID, MIN(CREATE_DATE) AS FIRST_STATUS_DATE, MAX(CREATE_DATE) AS LAST_STATUS_DATE FROM tablo1 GROUP BY ORDER_ID) t
WHERE table1.STATUS_ID = table2.STATUS_ID
如果你能帮助我,我会很高兴的。 祝你今天愉快。
对于在任一数据库中工作的版本,可以使用first_value()
和select distinction
:
select distinct t1.order_id,
first_value(t2.status_name) over (partition by t1.order_id order by t1.create_date) as first_status_name,
min(t1.create_date) over (partition by t1.order_id) as first_status_date,
first_value(t2.status_name) over (partition by t1.order_id order by t1.create_date desc) as last_status_name,
max(t1.create_date) over (partition by t1.order_id) as last_status_date
from table1 t1 join
table2 t2
on t2.status_id = t1.status_id;
编辑:
在MySQL的旧版本中,最简单的方法可能是使用group by
:
select t1.order_id,
substring_index(group_concat(t2.status_name order by t1.create_date), ',', 1) as first_status_name,
min(t1.create_date) as first_status_date,
substring_index(group_concat(t2.status_name order by t1.create_date desc), ',', 1) as last_status_name,
max(t1.create_date) s last_status_date
from table1 t1 join
table2 t2
on t2.status_id = t1.status_id
group by t1.order_id;
请注意,该版本假定状态描述没有逗号--并且不超过group_concat()
的MySQL内部长度限制。 但在大多数情况下是有效的。