如果我不能把最近的日期/时间放在SQLite的“WHERE”子句中,如何使用Max()函数获取它?

ffvjumwh  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(188)

我正在尝试选择最近的日期和时间。我知道我不能在WHERE子句中使用Max()函数,因为它不起作用。对于我的表4,我不想使用“GROUP BY”语句,因为我希望看到所有的ID。我尝试使用下面的代码,但它给了我一行,而不是表3中的多行。如果我不能在WHERE子句中使用Max()函数,还有什么其他方法可以获得最近的日期和时间?
表3:
ID|RESULT_Date1|RESULT_TIME_1|FINAL_Date1|FINAL_TIME_1
-|
766|2020年11月13日|12:12:12|2020年11月29日|13:11:12
766|2020年11月13日|12:12:12|2020年11月29日|14:11:12
765|2020年10月13日|12:12:12|2020年10月14日|11:11:12
765|2021-10-20|12:12:12|2020-10-21|12:13:14
表4所需的表:
ID|RESULT_Date1|RESULT_TIME_1|FINAL_Date1|FINAL_TIME_1
-|
766|2020年11月13日|12:12:12|2020年11月29日|14:11:12
765|2021-10-20|12:12:12|2020-10-21|12:13:14
代码:

CREATE TABLE table4 AS
SELECT *, 
        MAX(RESULT_DATE1)
FROM table3
/*WHERE RESULT_DATE1 || ' ' || RESULT_TIME_1*/
ORDER BY ID 
;
wlzqhblo

wlzqhblo1#

下面是一个使用row_number的简单解决方案。

select ID   
      ,RESULT_DATE1
      ,RESULT_TIME_1
      ,FINAL_DATE1  
      ,FINAL_TIME_1
from  (
       select *
              ,row_number() over (partition by ID order by FINAL_DATE1 desc,FINAL_TIME_1 desc) as rn
       from t
       ) t
where rn = 1

ID|RESULT_Date1|RESULT_TIME_1|FINAL_Date1|FINAL_TIME_1
-|
765|2021-10-20|12:12:12|2020-10-21|12:13:14
766|2020年11月13日|12:12:12|2020年11月29日|14:11:12
Fiddle

jtoj6r0c

jtoj6r0c2#

您可以使用像ROW_NUMBER()这样的窗口函数按ID对结果进行分区,并按日期降序,为每个分区选择第一个结果,如下所示:

WITH Numbered AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY RESULT_DATE_1 DESC, RESULT_TIME_1 DESC) RowNumber
FROM table4
)

SELECT * FROM Numbered WHERE RowNumber = 1

或者,您可以将结果GROUP BYJOIN添加到原始表中:

WITH MaxDate AS
(
SELECT ID, MAX(RESULT_DATE_1) LatestDate
FROM table4
GROUP BY ID
)

SELECT *
FROM table4 T
JOIN MaxDate M
ON 
    T.ID = M.ID
    AND T.RESULT_DATE_1 = M.LatestDate

相关问题