簡體   English   中英

MYSQL - 僅選擇先前記錄列數據不同的記錄

[英]MYSQL - Select Only Records Where Previous Record Column Data Differs

希望這可以通過 sql 實現。 我有一個查詢,它返回一個帶有 time_stamp 和 hash_index 列的數據集。 基本上有以下作用:

1   1583365548  6ff11ad5536f28d66098f6d74f97d877
2   1583365554  6ff11ad5536f28d66098f6d74f97d877
3   1583365556  6ff11ad5536f28d66098f6d74f97d877
4   1583365562  a2e99acb2540d49955ef93fb2684ac25
5   1583365571  a2e99acb2540d49955ef93fb2684ac25
6   1583365572  a2e99acb2540d49955ef93fb2684ac25
7   1583365574  a2e99acb2540d49955ef93fb2684ac25
8   1583365578  a2e99acb2540d49955ef93fb2684ac25
9   1583365580  a2e99acb2540d49955ef93fb2684ac25

我想要做的是進一步過濾此查詢以僅包含 hash_index 與前一條記錄不同的記錄。 這是我可以做的事情而不必將其轉儲到 PHP 中並循環遍歷它嗎?

我目前的查詢如下:

SELECT 
    (@cnt:=@cnt + 1) AS row_number,
    time_stamp,
    MD5(GROUP_CONCAT(CONCAT(user_state_name,
                        option_id,
                        option_code,
                        item_id,
                        item_code))) AS hash_index
FROM
    user_state
WHERE
    user_id = 2
GROUP BY
    time_stamp;

什么是這樣的查詢:

SELECT t1.*
FROM user_state t1
LEFT JOIN user_state t2 ON t1.id-1 = t2.id
WHERE t1.hash_index <> t2.hash_index;

如果您想過濾掉相鄰的重復項,我將只使用lag()並免除散列和聚合:

SELECT us.*
FROM (SELECT us.*,
             LAG(time_stamp) OVER (PARTITION BY user_id ORDER BY time_stamp) as prev_ts,
             LAG(time_stamp) OVER (PARTITION BY user_id, user_state_nae, option_id, option_code, item_id, item_code ORDER BY time_stamp) as prev_ts_values
      FROM user_state us
      WHERE user_id = 2
     ) t
WHERE prev_ts_values is null or prev_ts_values <> prev_ts;

您可以選擇所需的任何行。

暫無
暫無

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

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