![](/img/trans.png)
[英]How do i select the rows (from the first to the last) only where a column changes its value?
[英]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.