2010-07-07 2 views
2

У меня есть таблица следующимSQL последовательности подсчитывать

userid answer 

1   true 

1   true 

1   false 

1   true 

1   true 

1   true 

2   true 

1   true 

Я хочу, чтобы получить последний подсчет истинной последовательности для каждого пользователя

так, что я буду получать

userid count 

1   4 
2   1 

пожалуйста, помогите

+2

Какие СУБД вы используете? Также есть ли столбец с меткой времени или порядковым номером? –

+0

sql server, у меня нет ни одного – maggie

+0

Какая версия SQL Server? 2000? 2005? 2008? И вам нужно будет добавить один или другой. Столбец IDENTITY сделает! –

ответ

2
WITH Answers 
AS 
(
SELECT 1 AS xxxid , 1 AS userid, 'true' AS answer UNION ALL 
SELECT 2 AS xxxid , 1 AS userid, 'true' AS answer UNION ALL 
SELECT 3 AS xxxid , 1 AS userid, 'false' AS answer UNION ALL 
SELECT 4 AS xxxid , 1 AS userid, 'true' AS answer UNION ALL 
SELECT 5 AS xxxid , 1 AS userid, 'true' AS answer UNION ALL 
SELECT 6 AS xxxid , 1 AS userid, 'true' AS answer UNION ALL 
SELECT 7 AS xxxid , 2 AS userid, 'true' AS answer UNION ALL 
SELECT 8 AS xxxid , 1 AS userid, 'true' AS answer) 

SELECT userid, 
     COUNT(*) AS [COUNT] 
FROM  Answers A 
WHERE NOT EXISTS 
     (SELECT * 
     FROM Answers a2 
     WHERE answer = 'false' /*change this to 0 if using bit datatype*/ 
     AND  a2.userid = a.userid 
     ) 
OR  xxxid > 
     (SELECT MAX(xxxid) 
     FROM Answers a2 
     WHERE answer = 'false' /*change this to 0 if using bit datatype*/ 
     AND  a2.userid = a.userid 
     ) 
GROUP BY userid 
+1

спасибо, это сработало, я не могу проголосовать за вас, потому что у меня еще нет репутации ... но вскоре, когда я заработаю ... , – maggie

0

Что-то вроде ...

SELECT userid, 
     sum(case when answer='true' then 1 else 0 end) 
FROM {tablename} 
GROUP BY userid 
+0

Нет. Требуется длина последней непрерывной последовательности истин. –

+0

ОК, я неправильно понял вопрос :) Повторюсь еще раз – user210989

0
DECLARE @userID INT 
DECLARE @answer BIT 
DECLARE @answerCount INT 

DECLARE @AnswerCountTable AS TABLE 
(
    userID int, 
    answer int 
) 
-- Declare a cursor that will be used to search your table (userID, answer) 
DECLARE myCursor CURSOR 
    FOR SELECT * FROM YourTable 
OPEN myCursor 
WHILE @@FETCH_STATUS = 0 
BEGIN 
--Get The current userID and answer in variables 
    FETCH NEXT FROM myCursor INTO @userID, @answer; 
    IF @answer = true 
     BEGIN 
     UPDATE @AnswerCountTable 
      SET answer = answer + 1 
      WHERE userID = @userID 
     END 
    ELSE 
    BEGIN 
     UPDATE @AnswerCountTable 
      SET answer = 0 
      WHERE userID = @userID 
    END 
END 

--Close the cursor 
Deallocate myCursor 

--Return the result  
SELECT * 
FROM @AnswerCountTable 
+0

спасибо, сложным для моего недостающего – maggie

1

Попробуйте это:

create table t 
(
i int, 
userid int, 
answer varchar(1) 
); 

create table u 
(
userid int 
); 


insert into u values(1),(2); 

insert into t values 
(1, 1, 't'), 
(2, 1, 't'), 
(3, 1, 'f'), 
(4, 1, 't'), 
(5, 1, 't'), 
(6, 1, 't'), 
(7, 2, 't'), 
(8, 1, 't'); 





with user_latest_true 
as 
(
    select userid, max(i) as latest 
    from t 
    where answer = 'f' 
    group by userid 

    union 

    select u.userid, 0 as latest 
    from u 
    where userid not in (select userid from t where t.answer = 'f') 
) 
select t.userid, count(ult.userid) x 
from user_latest_true ult 
left join t on t.userid = ult.userid and t.i > ult.latest 
group by t.userid; 
0

Как насчет использования функции ранжирования?

WITH Answers AS 
( 
    SELECT * 
    FROM (VALUES 
    (1, 1, 't'), 
    (2, 1, 't'), 
    (3, 1, 'f'), 
    (4, 1, 't'), 
    (5, 1, 't'), 
    (6, 1, 't'), 
    (7, 2, 't'), 
    (8, 1, 't') 
) AS tbl(xxxid, userid, answer) 
), 
A AS 
(
    SELECT Answers.*, ROW_COUNT() OVER(PARTITION BY userid ORDER BY xxxid) AS RN1 
    FROM Answers 
), 
B AS 
(
    SELECT A.xxxid, A.userid, 
      A.RN1 - ROW_COUNT() OVER(PARTITION BY A.userid ORDER BY A.xxxid) AS GF 
    FROM A 
    WHERE A.answer = 't' 
), 
C AS 
(
    SELECT B.*, 
      COUNT() OVER(PARTITION BY B.userid, B.GF) AS CNT, 
      MAX(B.xxxid) OVER(PARTITION BY B.userid, B.GF) AS MAXID, 
      MAX(B.GF) OVER(PARTITION BY B.userid) AS MAXGF 
    FROM B 
) 
SELECT userid, CNT 
FROM C 
WHERE C.MAXGF = C.GF AND C.MAXID = C.xxxid 

На самом деле не проверял его, поэтому я немного кусаю губу.

0
SELECT userid, count(*) as count 
FROM Table 
WHERE answer = 'true' 
GROUP BY userid 

 Смежные вопросы

  • Нет связанных вопросов^_^