SQLite-запрос для определения первых 6 выигрышных номеров лото - PullRequest
0 голосов
/ 24 октября 2019

Итак, база данных такова:

CREATE TABLE Combination
(combinationNo INTEGER PRIMARY KEY NOT NULL,
N1 INTEGER NOT NULL,
N2 INTEGER NOT NULL,
N3 INTEGER NOT NULL,
N4 INTEGER NOT NULL,
N5 INTEGER NOT NULL,
N6 INTEGER NOT NULL,
UNIQUE (N1, N2, N3, N4, N5, N6)
);
CREATE TABLE Draw
(drawNo INTEGER PRIMARY KEY NOT NULL,
drawDate DATE NOT NULL,
drawName TEXT,
winCombinationNo INTEGER,
FOREIGN KEY (winCombinationNo) REFERENCES Combination (combinationNo)
);
CREATE TABLE Ticket
(ticketNo INTEGER PRIMARY KEY NOT NULL,
drawNo INTEGER NOT NULL,
soldAt TEXT NOT NULL,
FOREIGN KEY (drawNo) REFERENCES Draw (drawNo)
);
CREATE TABLE Line
(ticketNo INTEGER NOT NULL,
lineID TEXT NOT NULL,
combinationNo INTEGER NOT NULL,
PRIMARY KEY (ticketNo, lineID),
FOREIGN KEY (ticketNo) REFERENCES Ticket (ticketNo),
FOREIGN KEY (combinationNo) REFERENCES Combination (combinationNo)
);

Я вижу

FOREIGN KEY (winCombinationNo) REFERENCES Combination (combinationNo)

Но пока у меня есть только это:

SELECT combinationNo
FROM Combination
WHERE
LIMIT 6;

Я знаю, что ямне нужно где-то использовать соединение, но я не знаю, какое использовать, где и как.

1 Ответ

0 голосов
/ 24 октября 2019

Я полагаю, вы могли бы сделать что-то вроде: -

WITH 
    drawNumber AS (SELECT 2 /*<<<<<<<<<< The drawNo  */),
    winningNumbers(wn) AS 
        (
            SELECT n1||','||n2||','||n3||','||n4||','||n5||','||n6 FROM Draw JOIN Combination ON Draw.winCombinationNo = Combination.combinationNo WHERE Draw.drawNo = (SELECT * FROM drawNumber)
        )
SELECT 
    Ticket.ticketNo AS TicketNo, 
    Line.LineId, 
    n1||' '||n2||' '||n3||' '||n4||' '||n5||' '||n6 AS Entry,
    (SELECT * FROM winningNumbers) AS WinningNumbers,
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n1||',') > 0) +
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n2||',') > 0) +
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n3||',') > 0) +
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n4||',') > 0) +
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n5||',') > 0) +
    (instr((SELECT ','||wn||',' FROM winningNumbers),','||n6||',') > 0)
    AS score
FROM Line 
    JOIN Combination ON Line.CombinationNo = Combination.combinationNo
    JOIN Ticket ON Ticket.ticketNo = Line.TicketNo
WHERE score > 0 AND DrawNo = (SELECT * FROM drawNumber)
ORDER BY score DESC 
LIMIT 6
;

Это приведет к таким результатам: -

enter image description here

  • Обратите внимание, что из-за недостатка предоставленной информации определение выигрыша может отличаться от ожидаемого.

Вышеуказанное основано на случайной генерации до 100000 комбинаций (уменьшается при удалениикомбинации одинаковых чисел) и генерирование 20000 билетов, каждая из которых состоит из одной линии с четырьмя розыгрышами (номер 1-4 в розыгрыше).

Если учитывать количество набранных очков, то это будет простовопрос группировки по баллам и извлечения суммы баллов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...