Problem description & analysis:
The Excel table below has 4 columns. If we regard columns from the 2nd to the 4th as a whole, there are duplicates, as shown below:
A | B | C | D | |
1 | # | Product | Non Conf | Date |
2 | 1 | Apple | Worms | 4-Mar-24 |
3 | 3 | Apple | Worms | 4-Mar-24 |
4 | 2 | Pear | Worms | 4-Mar-24 |
5 | 7 | Pear | Worms | 5-Mar-24 |
6 | 11 | Pear | Worms | 6-Mar-24 |
7 | 10 | Orange | Worms | 6-Mar-24 |
8 | 12 | Orange | Worms | 6-Mar-24 |
9 | 9 | Apple | Rotten | 6-Mar-24 |
10 | 13 | Apple | Rotten | 7-Mar-24 |
11 | 4 | Pear | Rotten | 4-Mar-24 |
12 | 5 | Orange | Rotten | 5-Mar-24 |
13 | 6 | Orange | Rotten | 5-Mar-24 |
14 | 8 | Orange | Rotten | 6-Mar-24 |
15 | 14 | Orange | Rotten | 7-Mar-24 |
We want to select the same rows to form a new table while retaining the original order.
F | G | H | I | |
1 | # | Product | Non Conf | Date |
2 | 1 | Apple | Worms | 4-Mar-24 |
3 | 3 | Apple | Worms | 4-Mar-24 |
4 | 10 | Orange | Worms | 6-Mar-24 |
5 | 12 | Orange | Worms | 6-Mar-24 |
6 | 5 | Orange | Rotten | 5-Mar-24 |
7 | 6 | Orange | Rotten | 5-Mar-24 |
Solution:
Enter the following formula in SPL XLL:
=spl("=?.group@u(~.to(2,)).select(~.len()>1).conj()",A2:D15)
As shown in the picture below:
Explanation:
group()function groups the table rows; @ u option enables keeping the original order; ~ is the current member; and to(2,) gets child members of the current member from the 2nd to the last.
This case was originally on StackOverflow. The conventional solution is quite complicated, while the SPL approach is much simpler and more efficient.
Feel free to download esProc Desktop for FREE and experience the efficiency yourself:
SPL download address: esProc Desktop FREE Download
Plugin Installation Method: SPL XLL Installation and Configuration
References to other rich Excel operation cases: Desktop and Excel Data Processing Cases
YouTube FREE courses: SPL Programming