StrataScratch
Meta/Facebook is developing a search algorithm that will
allow users to search through their post history. You have been assigned to
evaluate the performance of this algorithm.
We have a table with the
user's search term, search result positions, and whether or not the user
clicked on the search result.
Write a query that assigns
ratings to the searches in the following way:
- If the search was not clicked for any term, assign the
search with rating=1
- If the search was
clicked but the top position of clicked terms was outside the top 3 positions,
assign the search a rating=2
- If the search was
clicked and the top position of a clicked term was in the top 3 positions,
assign the search a rating=3
As a search ID can contain more than one search term, select
the highest rating for that search ID. Output the search ID and its highest
rating.
Example: The search_id
1 was clicked (clicked = 1) and its position is outside of the top 3 positions
(search_results_position = 5), therefore its rating is 2.
table name: fb_search_events

Input Example:

Points to be noticed:
There are multiple search terms for the same search ID.
We need to calculate the ratings for each search_term separately.Which is basically based on the below condition
- If not clicked (clicked column value is 0) = 1 rating
- If clicked (clicked column value is 1) and position column value is >3 = 2 ratings
- If clicked (clicked column value is 1) and position column value is <=3 = 3 ratings
Solution Explanation:
We are going to apply case expression to calculate ratings
for each search term.
((case when clicked=0 then 1 else 0 end)+
(case when clicked=1 and search_results_position>3 then 2 else 0 end)+
(case when clicked=1 and search_results_position<=3 then 3 else 0 end)) as rating
select
search_id,search_term,
((case when clicked=0 then 1 else 0 end)+
(case when clicked=1 and search_results_position>3 then 2 else 0 end)+
(case when clicked=1 and search_results_position<=3 then 3 else 0 end)) as rating
from fb_search_events
Output:

As a search ID can contain more than one search term, select the highest rating for that search ID. Output the search ID and its highest rating.
As from the above output we can see that the same search id is repeated multiple times for different search terms. For example, search_id 3 is repeated 2 times for search term hotel and scandal with ratings 2 and 3 respectively.
But according to question we need to find highest rating for a particular search ID. Say in this example the output should be
As, highest rating for search_id 3 is 3.
Hence, we are going to modify our previous query
- Add
group by clause to group the result on the basis of search_id.
- Apply max function to calculate the maximum rating for that
particular search_id.
Final Solution:
select
search_id,
max((case when clicked=0 then 1 else 0 end)+
(case when clicked=1 and search_results_position>3 then 2 else 0 end)+
(case when clicked=1 and search_results_position<=3 then 3 else 0 end)) as rating
from fb_search_events
group by search_id
order by search_id
Final Output:

SQL Script:
USE [StrataScratch]
GO
CREATE TABLE [dbo].[fb_search_events](
[search_id] [int] NOT NULL,
[search_term] [varchar](50) NULL,
[clicked] [int] NULL,
[search_results_position] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (1, N'rabbit', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (2, N'airline', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (2, N'quality', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (3, N'hotel', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (3, N'scandal', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (5, N'rabbit', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (6, N'politics', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (10, N'rabbit', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (11, N'physical', 0, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (14, N'rabbit', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (14, N'cat', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (17, N'dog', 0, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (18, N'dog', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (38, N'dog', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (40, N'approach', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (40, N'national', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (50, N'rabbit', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (51, N'dog', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (51, N'week', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (41, N'law', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (42, N'cat', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (42, N'rabbit', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (43, N'church', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (44, N'station', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (44, N'hotel', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (52, N'cat', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (53, N'cat', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (56, N'dog', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (57, N'cat', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (57, N'dog', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (59, N'rabbit', 0, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (60, N'cat', 0, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (63, N'rabbit', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (63, N'cat', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (65, N'rabbit', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (68, N'rabbit', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (68, N'cat', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (69, N'educaiton', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (70, N'cat', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (74, N'dog', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (76, N'cat', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (77, N'rabbit', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (80, N'career', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (81, N'rabbit', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (82, N'rabbit', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (83, N'cat', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (84, N'dog', 1, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (85, N'boy', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (87, N'rabbit', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (90, N'dog', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (91, N'cat', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (92, N'cat', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (93, N'cat', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (93, N'rabbit', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (93, N'cat', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (96, N'dog', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (96, N'dog', 0, 3)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (97, N'dog', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (97, N'rabbit', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (97, N'dog', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (99, N'dog', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (120, N'rabbit', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (123, N'cat', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (182, N'education', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (321, N'summer', 0, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (331, N'national', 1, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (368, N'rabbit', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (649, N'cat', 0, 5)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (670, N'cat', 1, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (696, N'employee', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (720, N'police', 1, 1)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (738, N'sister', 1, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (739, N'dog', 0, 2)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (857, N'cat', 0, 4)
GO
INSERT [dbo].[fb_search_events] ([search_id], [search_term], [clicked], [search_results_position]) VALUES (953, N'fire', 1, 5)
GO