SQL查询仅显示最大值-怎么做?

时间:2018-12-15 04:55:12

标签: sql oracle11g

对不起,我的英语不好。

SELECT   
    siparisler.siparis_tarihi, MAX(ADET), urunler.urun_ismi
FROM 
    SIPARISLER,
    URUNLER,
    MUSTERILER,
    SIPARIS_DETAY
WHERE     
    SIPARISLER.SIPARISID = SIPARIS_DETAY.SIPARISID
    AND URUNLER.URUN_ID = SIPARIS_DETAY.URUN_ID
    AND MUSTERILER.MUSTERI_ID = SIPARISLER.MUSTERI_ID  
GROUP BY  
    urunler.urun_ismi ,siparis_tarihi 
ORDER BY 
    siparis_tarihi;

这是我的oracle SQL代码,这是结果

enter image description here

我怎么只显示这样的最大值:

enter image description here

每个日期我都可以显示最大的感谢行数

2 个答案:

答案 0 :(得分:0)

尝试按max(adet)降序排列结果,然后使用rownum = 1从结果中选择第一行。

SELECT *
       FROM (SELECT siparisler.siparis_tarihi,
                    max(adet),
                    urunler.urun_ismi
                    FROM siparis_detay
                         INNER JOIN siparisler
                                    ON siparisler.siparisid = siparis_detay.siparisid
                         INNER JOIN urunler
                                    ON urunler.urun_id = siparis_detay.urun_id
                         INNER JOIN musteriler
                                    ON musteriler.musteri_id = siparisler.musteri_id
                    GROUP BY urunler.urun_ismi,
                             siparisler.siparis_tarihi
                    ORDER BY max(adet) DESC) x
       WHERE rownum = 1;

您还应该使用显式联接语法以提高可读性。


编辑:

以上是对原始问题的解答。下面是评论。

尝试使用row_number()将行号分配给按日期划分的每一行,最大行号为adet,然后仅选择行号等于1的行。

SELECT y.siparis_tarihi,
       y.adet,
       y.urun_ismi
       FROM (SELECT x.siparis_tarihi,
                    x.adet,
                    x.urun_ismi,
                    row_number() OVER (PARTITION BY x.siparis_tarihi
                                       ORDER BY x.adet DESC) r
                    FROM (SELECT siparisler.siparis_tarihi,
                                 max(adet) adet,
                                 urunler.urun_ismi
                                 FROM siparis_detay
                                      INNER JOIN siparisler
                                                 ON siparisler.siparisid = siparis_detay.siparisid
                                      INNER JOIN urunler
                                                 ON urunler.urun_id = siparis_detay.urun_id
                                      INNER JOIN musteriler
                                                 ON musteriler.musteri_id = siparisler.musteri_id
                                 GROUP BY urunler.urun_ismi,
                                          siparisler.siparis_tarihi) x) y
       WHERE y.r = 1;

每个日期仅显示一条记录。如果要显示平局显示日期中具有最大值的所有行,请将row_number()替换为rank()

答案 1 :(得分:0)

在Oracle中,您可以使用keep功能进行聚合。这正是您想要的:

SELECT s.siparis_tarihi, MAX(ADET),
       MAX(u.urun_ismi) KEEP (DENSE_RANK FIRST ORDER BY ADET DESC)
FROM SIPARISLER s JOIN
     URUNLER u
     ON s.SIPARISID = u.SIPARISID JOIN
     SIPARIS_DETAY sd
     ON u.URUN_ID = sd.URUN_ID JOIN
     MUSTERILER m
     ON m.MUSTERI_ID = s.MUSTERI_ID
GROUP BY s.siparis_tarihi 
ORDER BY s.siparis_tarihi;

注意:

  • 这使用正确,明确,标准 JOIN的语法。 从不FROM子句中使用逗号。
  • 这使用简单的表别名。这些使表格更易于编写和阅读。