簡體   English   中英

使用日期和時間部分獲取最新記錄,匯總函數出錯

[英]Get the newest record using date and time portion, getting error on aggregate function

我正在嘗試使用狀態日期值獲取狀態為“已注冊,已過期”的最新記錄。

我有查詢,我正在使用具有13個記錄ID的特定批號。

SELECT
    MAX(STATUS_DATE)
,   LOT_NBR
,   RECORD_ID
FROM
    PERMIT P
INNER JOIN LOT L
    ON P.SERV_CODE = L.SERV_CODE
    AND P.ID1 = L.ID1
    AND P.ID2 = L.ID2
    AND P.ID3 = L.ID3
WHERE   
    L.STATUS IN ('Registered', 'Expired')   
    AND P.LOT NBR = '070826204235'
GROUP BY
    RECORD_ID
,   L.LOT_NBR

我得到這個清單:

STATUS_DATE             LOT_NBR         RECORD_ID
2018-12-28 10:11:32.887 070826204235    LR2014-00519
2018-12-28 09:53:52.400 070826204235    LR2016-01722
2018-12-28 09:44:52.487 070826204235    LR2016-01737
2018-12-28 09:44:07.440 070826204235    LR2016-01738
2018-12-28 09:43:19.263 070826204235    LR2016-01739
2018-12-28 09:42:39.313 070826204235    LR2016-01742
2018-12-28 09:39:42.513 070826204235    LR2016-01743
2018-12-28 09:38:46.527 070826204235    LR2016-01744
2018-12-28 09:37:57.007 070826204235    LR2016-01745
2018-12-28 09:35:47.300 070826204235    LR2016-01746
2018-12-28 09:34:41.737 070826204235    LR2016-01747
2018-12-28 09:20:30.663 070826204235    LR2016-01754
2018-12-28 09:19:13.900 070826204235    LR2016-01755

您可以根據STATUS_DATE時間部分的值來查看最新的LR2014-00519。

然后,我在RECORD_ID列周圍添加了另一個MAX,並在STATUS_DATE之前添加了ORDER

因此,修改后的查詢現在看起來像:

SELECT 
    MAX(RECORD_ID)
,   MAX(STATUS_DATE)
,   LOT_NBR
FROM
    P WITH(NOLOCK)
INNER JOIN LOT L WITH(NOLOCK)
    ON P.SERV_CODE = L.SERV_CODE
    AND P.ID1 = L.ID1
    AND P.ID2 = L.ID2
    AND P.ID3 = L.ID3
WHERE   
    STATUS IN ('Registered', 'Expired')
    AND L.LOT_NBR = '070826204235'
GROUP BY
    L.LOT_NBR
ORDER BY
    STATUS_DATE

但是當我運行它時,我看到一條錯誤消息:

Column "STATUS_DATE" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

但是我在SELECT的匯總函數MAX中有STATUS_DATE。

我究竟做錯了什么? 我希望有人可以提供一些幫助來糾正此問題。

非常感謝你。

您可以通過以下幾種方法執行此操作:

使用row_number()

  SELECT *
  FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY P.LOT NBR
                                      ORDER BY STATUS_DATE DESC) as rn
         FROM YourTable) as t
  WHERE t.rn = 1

或使用子查詢:

  SELECT *
  FROM YourTable t1
  WHERE STATUS_DATE  = (SELECT MAX(t2.STATUS_DATE)
                        FROM YourTable t2
                        WHERE t2.LOT_NBR = t1.LOT_NBR)

但是,在兩者上,您都必須謹慎處理關系。

但是我在SELECT的匯總函數MAX中有STATUS_DATE。

這是由於聚合造成的,通常情況下, STATUS_DATE在聚合時會消失,在這種情況下,除非您指定別名MAX(STATUS_DATE) AS STATUS_DATE ,否則不會執行排序

但是,我相信ROW_NUMBER()和Sub查詢將對您有幫助,請嘗試以下操作:

SELECT * 
FROM 
        (SELECT *,  ROW_NUMBER () OVER (PARTITION BY L.LOT_NBR ORDER BY STATUS_DATE DESC) RecentRN
        FROM     PERMIT P WITH(NOLOCK)
                    INNER JOIN LOT L WITH(NOLOCK)
                        ON P.SERV_CODE = L.SERV_CODE  AND P.ID1 = L.ID1  AND P.ID2 = L.ID2  AND P.ID3 = L.ID3
        WHERE   
            STATUS IN ('Registered', 'Expired') --AND L.LOT_NBR = '070826204235'
        ) as SQ
WHERE SQ.RecentRN = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM