繁体   English   中英

如何 select 仅在列值更改的最后 X 值

[英]How to select only last X values where column value changed

我怎样才能 select (MySQL) 最后例如 5 行,其中 NOTE 字段中的值已更改,每个不同的 ID?

例子:

    CREATE TABLE `LOGTABLE` (
  `ID` bigint(20) NOT NULL,
  `ITEM_ID` int(11) NOT NULL,
  `DATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `TYPE` tinyint(4) NOT NULL,
  `NOTE` varchar(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    ALTER TABLE `LOGTABLE`
  MODIFY `ID` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
COMMIT;

    INSERT INTO `LOGTABLE` (`ID`, `ITEM_ID`, `DATETIME`, `TYPE`, `NOTE`) VALUES
(2, 167, '2021-06-15 16:47:23', 0, 'T'),
(3, 168, '2021-06-15 16:48:11', 0, 'F'),
(4, 167, '2021-06-15 16:59:51', 0, 'T'),
(5, 168, '2021-06-15 17:00:48', 0, 'F'),
(6, 167, '2021-06-15 17:12:19', 0, 'T'),
(7, 168, '2021-06-15 17:13:25', 0, 'T'),
(8, 167, '2021-06-15 17:24:47', 0, 'F'),
(9, 168, '2021-06-15 17:26:02', 0, 'F'),
(10, 167, '2021-06-15 17:37:15', 0, 'T');

我想得到这个结果:

167- IDs 2,8,10
168- IDs 3,7,9

您可以使用Lag function 和Cte表,如下所示:

WITH Cte AS (
    SELECT *,
           LAG(Note,1) OVER(PARTITION BY Item_ID ORDER BY Id) PrevNote
    FROM [dbo].[LOGTABLE]
),   
Final AS(
    SELECT *,
           RANK() OVER (PARTITION BY ITem_ID ORDER BY ID DESC) rnk 
    FROM Cte AS c
    WHERE Note <> ISNULL(PrevNote,'')
)
SELECT * 
FROM final
WHERE rnk <= 5
ORDER BY ITem_ID

它为您提供以下结果:

ID  ITEM_I  DATETIME    TYPE      NOTE  PrevNote    rnk
10  167 2021-06-15 17:37:15.000 0   T   F            1
8   167 2021-06-15 17:24:47.000 0   F   T            2
2   167 2021-06-15 16:47:23.000 0   T   NULL         3
9   168 2021-06-15 17:26:02.000 0   F   T            1
7   168 2021-06-15 17:13:25.000 0   T   F            2
3   168 2021-06-15 16:48:11.000 0   F   NULL         3

它为每个已更改的 Item_Id 返回最多 5 行

这是一种方法:

 select item_id, GROUP_CONCAT(ID) Ids from ( select *, case when NOTE <> LAG(NOTE,1,'X') over (partition by item_id order by datetime) then 1 else 0 end lnote from LOGTABLE ) t where lnote = 1 group by item_id
  item_id | 标识 ------: |:----- 167 |  2,8,10 168 |  3,7,9

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM