1

Here's the question from an interview I'm prepping for...

Given a table messenger_sends: date | ts | sender_id | receiver_id| message_id | has_reaction

Q: how many unique conversation threads are there ?

I'm not even sure where to start!!

  • 1
    Possibly just send-receiver pairs? – shawnt00 Mar 30 '22 at 00:12
  • `select count(*) from (select sender_id, receiver_id from T where sender_id < receiver_id union select receiver_id, sender_id from T where receiver_id < sender_id) t` You'd have to do both ways since the conversation may only go one direction. – shawnt00 Mar 30 '22 at 00:14
  • `select count(*) from (select distinct case when sender_id < receiver_id then sender_id else receiver_id end s, case when sender_id < receiver_id then receiver_id else sender_id end r from T) t` – shawnt00 Mar 30 '22 at 00:20
  • https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=8bf33939d895ed006f375c6233053d6a – shawnt00 Mar 30 '22 at 00:21

2 Answers2

1

Here is one solution

create table table_name (sender_id int, receiver_id int);
insert into table_name values
(1,2),(1,2),(2,1),(1,3);
select count(ids)
from
(select distinct case when sender_id < receiver_id 
then concat(sender_id ,receiver_id) 
else concat(receiver_id, sender_id) end ids
from table_name) sub_query;
| (No column name) |
| ---------------: |
|                2 |

db<>fiddle here

0

You want to count the number of distinct {sender, receiver} sets -- not pairs because the order is not important.

For me this translates into:

SELECT COUNT(*)
FROM (
    SELECT DISTINCT a, b
    FROM (
        SELECT
            CASE WHEN sender_id < receiver_id THEN sender_id ELSE receiver_id END AS a, -- the smaller id
            CASE WHEN sender_id < receiver_id THEN receiver_id ELSE sender_id END AS b -- the larger id
            FROM Messages
        ) T
) U
Richard Barraclough
  • 2,625
  • 3
  • 36
  • 54