【问题标题】:Sort teams of a company distinct对不同公司的团队进行排序
【发布时间】:2017-09-27 05:38:00
【问题描述】:

我有一个用于在不同公司的团队之间生成匹配的数据库。

例子:

  • A公司有团队:team1、team2、team3
  • B 公司有团队:comp1、comp2
  • C 公司有团队:companyc
  • 公司 D 有团队:companyd1, companyd2

我必须生成球队之间的比赛,例如球队 1 不能与球队 2 一起比赛,因为是同一家公司。

我有这部分,但其他要求是他们可以连续比赛,例如如果第一场比赛是team1 vs comp1,第二场比赛应该是company c vs companyd。我怎样才能让同一支球队没有连续比赛?

这是我尝试的查询

select Cotejos.id_pelea, Partido1, Nombre1, Partido2, Nombre2,
 ronda = ROW_NUMBER() OVER(partition by Partido1 order by Partido1) 
  from Cotejos 
order by  ronda, newid()

按 partido1 的顺序给我结果,但 partido 2 在同一个 ronda 中重复

例如,命令是这样的

  Partido1    Nombre1              Partido2    Nombre2              ronda
----------- -------------------- ----------- -------------------- ----------
58          JJ Y LA ESTRELLA 2   1           AZTECA LAGUNA 3      1
123         LA JOYA 3            1           AZTECA LAGUNA 3      1
141         EL MILAGRO 2         1           AZTECA LAGUNA 1      1
2           GREGORIO GARCIA      3           CHICHO 1             1
5           GUARDADO 1           11          MA LUISA 2           1
119         GUARDADO 2           11          MA LUISA 3           1
14          RIELEROS Y CUMBRES 2 13          COMPADRES Y 28 DE OC 1

我喜欢这样的东西

 Partido1    Nombre1              Partido2    Nombre2          ronda
----------- ----------- -------------------- ----------- -------------------
   58          JJ Y LA ESTRELLA 2   1           AZTECA LAGUNA 3      1
   2           GREGORIO GARCIA      3           CHICHO 1             1
   5           GUARDADO 1           11          MA LUISA 2           1
   123         LA JOYA 3            1           AZTECA LAGUNA 3      2
   14          RIELEROS Y CUMBRES 2 13          COMPADRES Y 28 DE OC 2
   119         GUARDADO 2           11          MA LUISA 3           2
   141         EL MILAGRO 2         1           AZTECA LAGUNA 1      3

【问题讨论】:

  • 请发表您尝试过的查询
  • 一种选择是为公司内部的每个团队生成 row_number(),例如使用 newid(),然后将数据与行号完全外连接。您仍然必须以某种方式确保您首先选择拥有最多团队的公司,以便您可以获得所有可能存在的团队的匹配。

标签: sql-server database


【解决方案1】:

以下内容会有所帮助。注意我借用了endo64SQL Server Random Sort中的答案

设置:

CREATE TABLE Table1
    ([Team] varchar(9), [Company] varchar(1))
;

INSERT INTO Table1
    ([Team], [Company])
VALUES
    ('team1', 'a'),
    ('team2', 'a'),
    ('team3', 'a'),
    ('comp1', 'b'),
    ('comp2', 'b'),
    ('companyc', 'c'),
    ('companyd1', 'd'),
    ('companyd2', 'd')
;

查询:

select
*
from (
    select
        t1.company t1company
      , t1.team    t1team
      , t2.company
      , t2.team
      , CAST(CHECKSUM(NEWID(), t1.team + t2.team) & 0x7fffffff AS float) x
      , row_number() over(partition by t1.company, t1.team order by t2.company, t2.team) y
    from table1 t1
    inner join table1 t2 on t1.company <> t2.company
    ) d
order by x,y
;

示例结果:

+----+-----------+-----------+---------+-----------+------------+---+
|    | t1company |  t1team   | company |   team    |     x      | y |
+----+-----------+-----------+---------+-----------+------------+---+
|  1 | d         | companyd2 | a       | team3     |   31131597 | 3 |
|  2 | d         | companyd1 | b       | comp2     |   68902928 | 5 |
|  3 | a         | team1     | d       | companyd1 |   84530144 | 4 |
|  4 | a         | team3     | b       | comp1     |  107683738 | 1 |
|  5 | b         | comp2     | d       | companyd2 |  129452170 | 6 |
|  6 | d         | companyd1 | a       | team1     |  138089373 | 1 |
|  7 | b         | comp1     | d       | companyd1 |  184674639 | 5 |
|  8 | b         | comp2     | a       | team2     |  245733279 | 2 |
|  9 | b         | comp2     | a       | team3     |  288973989 | 3 |
| 10 | c         | companyc  | d       | companyd2 |  364018545 | 7 |
| 11 | c         | companyc  | a       | team2     |  375979006 | 2 |
| 12 | a         | team1     | c       | companyc  |  462231202 | 3 |
| 13 | a         | team1     | b       | comp1     |  486348018 | 1 |
| 14 | a         | team2     | d       | companyd2 |  496110190 | 5 |
| 15 | b         | comp1     | c       | companyc  |  528186078 | 4 |
| 16 | a         | team3     | d       | companyd2 |  546847917 | 5 |
| 17 | b         | comp2     | c       | companyc  |  622910319 | 4 |
| 18 | d         | companyd1 | a       | team3     |  635260954 | 3 |
| 19 | a         | team2     | d       | companyd1 |  669458404 | 4 |
| 20 | a         | team1     | b       | comp2     |  688780068 | 2 |
| 21 | c         | companyc  | a       | team3     |  833897192 | 3 |
| 22 | a         | team3     | c       | companyc  |  872387088 | 3 |
| 23 | b         | comp1     | a       | team2     |  877053008 | 2 |
| 24 | d         | companyd2 | a       | team1     |  902437371 | 1 |
| 25 | c         | companyc  | b       | comp2     |  922241817 | 5 |
| 26 | a         | team3     | b       | comp2     |  967040931 | 2 |
| 27 | d         | companyd1 | a       | team2     |  999743107 | 2 |
| 28 | d         | companyd2 | c       | companyc  | 1018794780 | 6 |
| 29 | b         | comp2     | d       | companyd1 | 1027985306 | 5 |
| 30 | b         | comp1     | a       | team1     | 1073627799 | 1 |
| 31 | d         | companyd2 | b       | comp2     | 1113395974 | 5 |
| 32 | d         | companyd2 | a       | team2     | 1209387221 | 2 |
| 33 | b         | comp1     | d       | companyd2 | 1254602047 | 6 |
| 34 | d         | companyd2 | b       | comp1     | 1334441382 | 4 |
| 35 | b         | comp1     | a       | team3     | 1371977984 | 3 |
| 36 | c         | companyc  | a       | team1     | 1381544075 | 1 |
| 37 | a         | team1     | d       | companyd2 | 1429828466 | 5 |
| 38 | a         | team3     | d       | companyd1 | 1442493066 | 4 |
| 39 | a         | team2     | b       | comp1     | 1456589262 | 1 |
| 40 | d         | companyd1 | c       | companyc  | 1478490615 | 6 |
| 41 | a         | team2     | b       | comp2     | 1506880312 | 2 |
| 42 | b         | comp2     | a       | team1     | 1719739712 | 1 |
| 43 | d         | companyd1 | b       | comp1     | 1881729625 | 4 |
| 44 | c         | companyc  | b       | comp1     | 1979525600 | 4 |
| 45 | c         | companyc  | d       | companyd1 | 2013576803 | 6 |
| 46 | a         | team2     | c       | companyc  | 2140739362 | 3 |
+----+-----------+-----------+---------+-----------+------------+---+

【讨论】:

  • 我需要 t1 公司和 t2 公司在连续的数学中不重复,在您的示例结果中,前 2 行是我需要的同一家公司,双方的公司都不是连续我知道公司不仅在一侧是连续的,如果我按 y 列排序,公司 a 是连续的
  • 不要单独按 Y 排序。不建议这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多