表分组方式 - Sql -

Posted

技术标签:

【中文标题】表分组方式 - Sql -【英文标题】:Table Group By - Tsql - 【发布时间】: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

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于表分组方式 - Sql -的主要内容,如果未能解决你的问题,请参考以下文章

sql语句分组/排序/计算总数/连接等sql语句书写

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

sql中根据表中一个字段分组分别统计每个分组的记录数

sql 按表分组然后对其进行排序。

没有 pl/sql 的“前导行”的 SQL 分组表

如何在Sql中对表进行分组?