2017-02-28 5 views
0

Ich muss die Top-Bewerber von letzter Woche finden, aber ich bekomme Fehler in meiner SQL-Abfrage.SQL-Aggregat Spalte Problem

var queryString = "select id, created_at, user_id, count(id) as cnt from "+ 
     "applications where id in (select id from applications where "+ 
     "created_at > current_date - interval '1 week') group by user_id"; 

data.sql

insert into listings (id, created_at, created_by, name, description) values 
    (1, '2015-01-15 11:00', 1, 'Join us conquering the world!', 'This is your best chance to be on the right side of the equation...') 
; 

insert into listings (id, created_at, created_by, name, description) values 
    (1, '2015-01-15 11:00', 1, 'Join us conquering the world!', 'This is your best chance to be on the right side of the equation...') 
; 

insert into listings (id, created_at, created_by, name, description) values 
    (2, '2017-01-29 11:00', 1, 'Join us conquering the world!', 'Holla ho') 
; 

insert into listings (id, created_at, created_by, name, description) values 
    (3, '2017-01-15 11:00', 1, 'Join us conquering the world!', 'Hey ya') 
; 

insert into applications (created_at, user_id, listing_id, cover_letter) values 
    ('2017-02-23 12:00', 2, 1, 'Hello, ...') 
; 

INSERT INTO APPLICATIONS (CREATED_AT, USER_ID, LISTING_ID, COVER_LETTER) VALUES 
    ('2017-02-24 12:00', 2, 2, 'HELLO, ...') 
; 

INSERT INTO APPLICATIONS (CREATED_AT, USER_ID, LISTING_ID, COVER_LETTER) VALUES 
    ('2017-02-22 12:00', 2, 2, 'HELLO, ...') 
; 

INSERT INTO APPLICATIONS (CREATED_AT, USER_ID, LISTING_ID, COVER_LETTER) VALUES 
    ('2017-02-25 12:00', 3, 1, 'HELLO, ...') 
; 

Und hier ist der Fehler:

column "applications.id" must appear in the GROUP BY clause or be used in an aggregate function 

Was mache ich falsch?

Also, im Grunde würde Ich mag Benutzer-ID 2 mit 3 Anwendungen und Benutzer-ID 3 mit 1 Anwendung sehen.

+0

markieren Sie bitte die dbms Sie verwenden. –

+3

Der Fehler ist sehr klar. Sie müssen die 'applications.Id' zur group by-Klausel hinzufügen. – Sparrow

+0

@FeryalBadili nicht so einfach. In der Abfrage von OP wählt er 'id, created_at, ...' aus, so dass er mindestens die Spalten 'id' und 'created_at 'in GROUP BY übergeben muss, um Fehler zu übergeben. Aber ich denke, OP arbeitet zunächst mit einer falschen Anfrage, er hat seine Absicht für die COUNT-Funktion einfach nicht verstanden. –

Antwort

1

Sie können diese Abfrage beabsichtigen:

select user_id, count(id) as cnt 
from applications 
where id in (select id 
      from applications 
      where created_at > current_date - interval '1 week' 
      ) 
group by user_id; 

Beachten Sie die Spalten, die von der select entfernt werden.

Wenn wir davon ausgehen, dass id tatsächlich einzigartig ist, können Sie tun:

select user_id, count(id) as cnt 
from applications 
group by user_id 
having max(created_at) > current_date - interval '1 week'; 
Verwandte Themen