2017-03-24 1 views
0

Tableau des ventes:Afficher t le t 2 plus t payé t montant t produit t dans t tous t jour

create table sales ( 
    Date date, 
    customer_id integer, 
    product_id integer, 
    units_sold integer, 
    paid_amount integer 
    ); 

Insert into sales (Date, customer_id, product_id, units_sold, paid_amount) 
VALUES 
('2016-01-01', '1', '1', '5', '45'), 
('2016-01-01', '2', '1', '2', '18'), 
('2016-01-01', '3', '2', '7', '35'), 
('2016-01-07', '1', '3', '3', '45'), 
('2016-01-07', '2', '2', '5', '25'), 
('2016-01-07', '4', '2', '5', '25'), 
('2016-01-10', '1', '4', '5', '30'), 
('2016-01-10', '2', '4', '5', '30'), 
('2016-01-10', '4', '5', '6', '60'), 
('2016-01-10', '4', '3', '9', '135'), 
('2016-01-14', '3', '1', '4', '60'), 
('2016-01-14', '2', '3', '6', '90'), 
('2016-01-14', '2', '3', '6', '90'); 

Afficher le produit 2e montant le plus payé tous les jours?

J'essaie cette requête: Mais je ne reçois pas le résultat pour la date 14e reste de la date est très bien.

SELECT * 
    FROM (
    SELECT 
     date, 
     customer_id, 
     product_id, 
     paid_amount, 
     rank() OVER (
     PARTITION BY date 
     ORDER BY paid_amount 
     DESC 
     ) 
FROM sales) s 
WHERE rank = 2; 
+1

utilisation 'dense_rank' au lieu de' rang '. le rang ignore les nombres s'il y a plusieurs rangées ayant le même rang, par autant de nombres-1. –

+0

@vkp merci beaucoup – Rock

+0

Non lié, mais: veuillez vous habituer à utiliser des constantes qui correspondent au type de données de la colonne. ''45' 'est une valeur de chaîne, pas un nombre –

Répondre

0

Comme par VKP:

SELECT * 
    FROM (
    SELECT 
     date, 
     customer_id, 
     product_id, 
     paid_amount, 
     dense_rank() OVER (
     PARTITION BY date 
     ORDER BY paid_amount 
     DESC 
     ) 
FROM sales) s 
WHERE rank = 2; 

Pour le contexte, imaginez une liste de valeurs, le rang et l'ordre DENSE_RANK desc:

Value Rank() Dense_Rank() 
100  1   1 
90  2   2 
90  2   2 
80  4   3 
70  5   4 
0
SELECT DISTINCT 
    date, 
    nth_value(paid_amount, 2) 
     OVER (PARTITION BY date 
      ORDER BY paid_amount 
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
      ) "2nd value" 
FROM sales 
ORDER BY date; 

┌────────────┬───────────┐ 
│ date │ 2nd value │ 
├────────────┼───────────┤ 
│ 2016-01-01 │  35 │ 
│ 2016-01-07 │  25 │ 
│ 2016-01-10 │  30 │ 
│ 2016-01-14 │  90 │ 
└────────────┴───────────┘ 
(4 rows) 
+0

Pourquoi 30 le 10 et 90 le 14, il devrait être 60 le 10 et 60 le 14. – Rock

+0

Je ne peux pas suivre 60 le 14. Vous n'avez pas dit que vous voulez le troisième si les deux premiers sont égaux. –