I'll put my comments together and post them as an answer just for clarity. I expect you won't be very satisfied, however, as all I do is reduce your problem to another problem.
My notation:
$Q$ is a RV whose support is $\mathbb{Q}\cap\left[0,1\right]$ -- my $Q$ is not the same as the $Q$ the OP constructs from his $\frac{X}{Y}$. We'll define this $Q$ using $Y$ and $f$, which I introduce below.
$Y$ is any RV whose support is $\mathbb{N}\equiv\left\{1, 2, \ldots\right\}$ -- the $Y$ given by the OP would work, for example.
$f$ is any one-to-one correspondence $f:\mathbb{N}\rightarrow\mathbb{Q}\cap\left[0,1\right]$ and $f^{-1}$ is its inverse. We know these exist.
Now I claim I can reduce your problem to just finding an $f$ and its $f^{-1}$:
Just let $Q=f^{-1}\left(Y\right)$$Q=f\left(Y\right)$ and you are done. The PMF of $Q$ is $\Pr[Q =q] = \Pr[Y = f^{-1}(q)]$.
Edit:
Here is a function g that plays the role of $f$, despite not being a one-to-one correspondence (because of duplicates):
g <- function(y) {
y <- as.integer(y)
stopifnot(y >= 1)
b <- 0
a <- 0
for (unused_index in seq(1, y)) {
if (a >= b) {
b <- b+1
a <- 0
} else {
a <- a+1
}
}
return(sprintf("q = %s / %s", a, b))
## return(a / b)
}