【问题标题】:Table Group By - Tsql -表分组方式 - Sql -
【发布时间】:2010-10-07 22:38:49
【问题描述】:

alt text http://img187.imageshack.us/img187/8453/testhc3.png

alt text http://img145.imageshack.us/img145/3306/test2bn4.png

第一张图片是我的查询。我需要在第二张图片中获得结果。

select OrarioA, OrarioB, MAX(VW_DettaglioOrariLinee_FromAToB.IDOrario), dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioA, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioB
FROM         dbo.VW_DettaglioOrariLinee_FromAToB INNER JOIN
                      Tb_Linee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDRelA = Tb_Linee.IDRelA AND 
                      dbo.VW_DettaglioOrariLinee_FromAToB.IDRelB = Tb_Linee.IDRelB INNER JOIN
                      dbo.periodi ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.periodi.IDOrario INNER JOIN
                      dbo.relgiornisettimanaorarilinee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.relgiornisettimanaorarilinee.IDOrario

这是我真正的查询:

WITH Tb_Linee AS
(
    SELECT * FROM VW_rellineestazionamenti 
    WHERE 
    IDLINEA = @IDLINEA 
    AND 
    IDStazA = @IDStazA 
    AND
    IDStazB = @IDStazB 
    AND
    PosizioneA = @PosizioneA
    AND
    PosizioneB = @PosizioneB
)


select OrarioA, OrarioB, VW_DettaglioOrariLinee_FromAToB.IDOrario, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioA, dbo.VW_DettaglioOrariLinee_FromAToB.IDDettaglioOrarioB
FROM         dbo.VW_DettaglioOrariLinee_FromAToB INNER JOIN
                      Tb_Linee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDRelA = Tb_Linee.IDRelA AND 
                      dbo.VW_DettaglioOrariLinee_FromAToB.IDRelB = Tb_Linee.IDRelB INNER JOIN
                      dbo.periodi ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.periodi.IDOrario INNER JOIN
                      dbo.relgiornisettimanaorarilinee ON dbo.VW_DettaglioOrariLinee_FromAToB.IDOrario = dbo.relgiornisettimanaorarilinee.IDOrario

【问题讨论】:

    标签: sql-server database tsql group-by


    【解决方案1】:

    如果您只想按OrarioA 进行分区:

    SELECT OrarioA, OrarioB, IDOrario, IDDettaglioOrarioA, IDDettaglioOrarioB
    FROM (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY OrarioA ORDER BY OrarioB DESC, IDOrario DESC) AS rn
      FROM table
      ) t
    WHERE rn = 1
    

    ,这将产生picture 2 上的结果集。

    如果你想通过OrarioAOrarioB进行分区:

    SELECT OrarioA, OrarioB, IDOrario, IDDettaglioOrarioA, IDDettaglioOrarioB
    FROM (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY OrarioA, OrarioB ORDER BY IDOrario DESC) AS rn
      FROM table
      ) t
    WHERE rn = 1
    

    ,但这不会过滤掉结果集中的第一行。

    【讨论】:

    • 只有一个问题,如果我想按 OrarioA 和 OrarioB 分区。我该怎么办?谢谢!!
    【解决方案2】:

    根据您在屏幕截图中解释的数据,我理解您需要按 OrarioA 和 OrarioB 分组的最高 IDOrario 的 id 字段?

    SELECT IDDettaglioOrarioA, IDDettaglioOrarioB
    FROM TABLE 
    GROUP BY
    OrarioA, OrarioB
    ORDER BY IDOrario DESC
    

    如果您需要选择更多列,请随意选择更多。

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 2013-03-15
      • 2017-03-07
      • 2017-03-04
      • 2012-09-28
      • 1970-01-01
      • 2018-09-23
      • 2019-03-29
      • 2022-01-24
      相关资源
      最近更新 更多